背景:我有一项工作任务是将svn某文件夹日常更新的sql文件(归类到日期命名的文件夹中)拿到数据库中运行。

一開始,我是先把sql文件update下来,用notepad++打开,拷贝每个文本的sql语句。放到plsql中运行。尽管如今仅仅有几个。我手动运行没有问题,可是我想以后有一天sql文件有几十或者上百呢...

我办公用的电脑是win10,cmd下的我想到了用copy *.sql > all.sql,如此合并之后all.sql有中文乱码,后来问同事才知道那个SVN文件夹下是开发提交的sql脚本。有gbk、utf8、gb2312等各种格式,已无力吐槽(涉及到公司的内容。图就不贴了)。

然后我就上网各种查cmd下是否有字符集转换的命令,网友给我说了这个win_iconv,可是在linux下iconv也要知道原字符集才干转啊。

于是,我觉定要动手搞下python了,一边上网查一遍自己尝试,这是终于版本号:

mergeSql.py

  1. # -*- coding: gbk -*-
  2. '''
  3. 说明:
  4.     1、2015/10/28,这个版本号已经可以成功使用,仅仅能处理当前目录下的sql文件(子目录忽略)
  5. '''
  6. import os
  7. import sys
  8. import chardet
  9.  
  10. reload(sys)
  11. sys.setdefaultencoding("gbk")
  12. fType_input = sys.argv[1]
  13. fileName_output = sys.argv[2]
  14. path_input = sys.argv[3]
  15.  
  16. def mergeSql(fdir, fType, outfile):
  17.     if os.path.exists(outfile):
  18.         os.remove(outfile)
  19.     file_to_write = file(outfile, 'w')
  20.     file_list = os.listdir(fdir)
  21.     for f in file_list:
  22.         if str(f).split(".")[-1] == fType:
  23.             if os.path.isfile(os.path.join(fdir, str(f).decode('gbk'))):
  24.                 file_to_read = file(os.path.join(fdir, str(f).decode('gbk')), 'r')
  25.             file_to_write.write('\r\n/*----'+str(f).decode('gbk')+'----*/\r\n')
  26.             print 'merge...'+str(f).decode('gbk')
  27.  
  28.             while 1:
  29.                 line = file_to_read.readline()
  30.                 encoding = chardet.detect(line)['encoding']
  31.                 if len(line) == 0:
  32.                     break
  33.                 else:
  34.                     if encoding in ['ISO-8859-2', 'windows-1252', 'GB2312']:
  35.                         file_to_write.write(line.encode("gbk"))
  36.                         continue
  37.                     file_to_write.write(line.decode(encoding).encode("gbk"))
  38.             file_to_read.close()
  39.     file_to_write.write('\r\nexit;')
  40.     file_to_write.close()
  41.  
  42. if __name__ == '__main__':
  43.     mergeSql(path_input, fType_input, fileName_output)
  1.  

当然,还得先安装第三方模块。pip install chardet。

上一个版本号还是蛮土的,长这样:

  1. line = file_to_read.readline()
  2. encoding = chardet.detect(line)['encoding']
  3. if encoding == 'ascii':
  4. line = line.decode('ascii').encode('utf-8')
  5. elif encoding == 'utf-8':
  6. pass
  7. elif encoding == 'GB2312':
  8. line = line.decode('GB2312').encode('utf-8')

这样子不好,就仅仅能处理三种字符集;不要问我为什么不直接转换为gbk,我也不知道为什么,直接转报错了,先统一转换为utf-8再转换为gbk是ok的!

最后。要结合sqlplus才干一键运行:

run.bat

  1. set dateT=2015-10-27
  2. python mergeSql.py sql %dateT%.sql %dateT%
  3. sqlplus TEST/TEST@10-10-0-60-qgtgwsbs @%dateT%.sql > %dateT%.log
  4. pause

mergeSql.py 要传两个參数。python mergeSql.py arg1 args2

arg1是处理的文件名称后缀,arg2是合并生成的文件(脚本执行时,假设这个文件存在则删除)。

另:转为gbk是由于sqlplus和cmd的编码字符集都是gbk,假设是其它字符集则cmd窗体看到的是中文乱码。

如今这项工作就变成先update。之后双击下run.bat,最后看下运行日志log完事。

用python合并N个不同字符集编码的sql文件的实践的更多相关文章

  1. python全栈开发_day7_字符编码,以及文件的基本读取

    一:字符编码 1)什么是字符编码 将人能识别的字符等高级标识符与计算机所能识别的二进制01进行转化,这之间的交流需要一个媒介,进行两种标识符之间的转化. 字节的存储方式为八个二进制位 2)乱码 存放数 ...

  2. Python不再为字符集编码发愁,使用chardet轻松解决你的困扰。

    欢迎添加华为云小助手微信(微信号:HWCloud002 或 HWCloud003),输入关键字"加群",加入华为云线上技术讨论群:输入关键字"最新活动",获取华 ...

  3. 字符集编码与Python(一)编码历史

    编码历史 ASCII ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于 ...

  4. 各种编码中汉字所占字节数;中文字符集编码Unicode ,gb2312 , cp936 ,GBK,GB18030

    vim settings set fileencodings=utf-8,ucs-bom,gb18030,gbk,gb2312,cp936,latin1set termencoding=utf-8se ...

  5. 字符集编码Unicode ,gb2312 cp936

    这是一篇程序员写给程序员的趣味读物.所谓趣味是指可以比较轻松地了解一些原来不清楚的概念,增进知识,类似于打RPG游戏的升级.整理这篇文章的动机是两个问题: 问题一:使用Windows记事本的“另存为” ...

  6. Python : 熟悉又陌生的字符编码(转自Python 开发者)

    Python : 熟悉又陌生的字符编码 字符编码是计算机编程中不可回避的问题,不管你用 Python2 还是 Python3,亦或是 C++, Java 等,我都觉得非常有必要厘清计算机中的字符编码概 ...

  7. 中文字符集编码Unicode ,gb2312 , cp936 ,GBK,GB18030

    中文字符集编码Unicode ,gb2312 , cp936 ,GBK,GB18030 cp936是微软自己发布的用在文件系统中的编码方式.而bg2312是中国国家标准.我明白mount -t vfa ...

  8. 基于Python的数据分析(2):字符串编码

    在上一篇文章<基于Python的数据分析(1):配置安装环境>中的第四个步骤中我们在python的启动步骤中强制要求加载sitecustomize.py文件并设置其默认编码为"u ...

  9. {MySQL数据库初识}一 数据库概述 二 MySQL介绍 三 MySQL的下载安装、简单应用及目录介绍 四 root用户密码设置及忘记密码的解决方案 五 修改字符集编码 六 初识sql语句

    MySQL数据库初识 MySQL数据库 本节目录 一 数据库概述 二 MySQL介绍 三 MySQL的下载安装.简单应用及目录介绍 四 root用户密码设置及忘记密码的解决方案 五 修改字符集编码 六 ...

随机推荐

  1. linux下时间操作1

    本文是对我之前写的文章:C++时间操作 的更深入补充.之前那个文章就是一个快速入门的东西,后面力图把一些更深入的细节补充完整. 时间分类的基本介绍 在介绍一些时间相关的操作函数之前,先来介绍一下lin ...

  2. 关于http ,那些你必须知道的事

    一,HTTP简介 1,HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览 ...

  3. 利用inotifywait监控主机文件和目录

    利用inotifywait监控主机文件和目录 inotifywait 是一个可以实时监控文件变动的工具,它利用linux内核中的inotify机制实现监控功能. 查看内核版本 [root@Oracle ...

  4. JQuery EasyUI datagrid pageNumber 分页 请求/加载 两次

    解决方案: 原因是 jquery.easyui.min.js 源文件中,由于第1页的total和其他页的total不相等,EasyUI会重新发起第1页的请求!1.jQuery EasyUI 1.4.1 ...

  5. Javaweb开发中关于不同地方出现的绝对路径和相对路径

    1.转发和包含路径 a)以“/”开头:相对当前项目路径,即默认为http://localhost:8080/项目名/ b)不以“/”开头:相对当前Servlet路径. eg:在Aservlet中写“B ...

  6. ext树菜单实体类

    package cn.edu.hbcf.common.vo; import java.util.ArrayList; import java.util.List; /** * ext树菜单 * * @ ...

  7. 记centos 安装 mysql5.7.23.tar.gz教程

    1.下载tar包,这里使用wget从官网下载 wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.22-linux-glibc2. ...

  8. 爬虫 (6)- Scrapy 实战案例 - 爬取不锈钢的相关钢卷信息

    超详细创建流程及思路 一. 新建项目 1.创建文件夹,然后在对应文件夹创建一个新的python项目 2.点击Terminal命令行窗口,运行下面的命令创建scrapy项目 scrapy startpr ...

  9. 关联数据和formatter问题-easyui+微型持久化工具

    控制器 using System; using System.Collections.Generic; using System.Linq; using System.Web; using Syste ...

  10. datagrid带查询带分页

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat=&qu ...