用python合并N个不同字符集编码的sql文件的实践
背景:我有一项工作任务是将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
# -*- coding: gbk -*-
'''
说明:
1、2015/10/28,这个版本号已经可以成功使用,仅仅能处理当前目录下的sql文件(子目录忽略)
'''
import os
import sys
import chardet reload(sys)
sys.setdefaultencoding("gbk")
fType_input = sys.argv[1]
fileName_output = sys.argv[2]
path_input = sys.argv[3] def mergeSql(fdir, fType, outfile):
if os.path.exists(outfile):
os.remove(outfile)
file_to_write = file(outfile, 'w')
file_list = os.listdir(fdir)
for f in file_list:
if str(f).split(".")[-1] == fType:
if os.path.isfile(os.path.join(fdir, str(f).decode('gbk'))):
file_to_read = file(os.path.join(fdir, str(f).decode('gbk')), 'r')
file_to_write.write('\r\n/*----'+str(f).decode('gbk')+'----*/\r\n')
print 'merge...'+str(f).decode('gbk') while 1:
line = file_to_read.readline()
encoding = chardet.detect(line)['encoding']
if len(line) == 0:
break
else:
if encoding in ['ISO-8859-2', 'windows-1252', 'GB2312']:
file_to_write.write(line.encode("gbk"))
continue
file_to_write.write(line.decode(encoding).encode("gbk"))
file_to_read.close()
file_to_write.write('\r\nexit;')
file_to_write.close() if __name__ == '__main__':
mergeSql(path_input, fType_input, fileName_output)
当然,还得先安装第三方模块。pip install chardet。
上一个版本号还是蛮土的,长这样:
line = file_to_read.readline()
encoding = chardet.detect(line)['encoding']
if encoding == 'ascii':
line = line.decode('ascii').encode('utf-8')
elif encoding == 'utf-8':
pass
elif encoding == 'GB2312':
line = line.decode('GB2312').encode('utf-8')
这样子不好,就仅仅能处理三种字符集;不要问我为什么不直接转换为gbk,我也不知道为什么,直接转报错了,先统一转换为utf-8再转换为gbk是ok的!
最后。要结合sqlplus才干一键运行:
run.bat
set dateT=2015-10-27
python mergeSql.py sql %dateT%.sql %dateT%
sqlplus TEST/TEST@10-10-0-60-qgtgwsbs @%dateT%.sql > %dateT%.log
pause
mergeSql.py 要传两个參数。python mergeSql.py arg1 args2
arg1是处理的文件名称后缀,arg2是合并生成的文件(脚本执行时,假设这个文件存在则删除)。
另:转为gbk是由于sqlplus和cmd的编码字符集都是gbk,假设是其它字符集则cmd窗体看到的是中文乱码。
如今这项工作就变成先update。之后双击下run.bat,最后看下运行日志log完事。
用python合并N个不同字符集编码的sql文件的实践的更多相关文章
- python全栈开发_day7_字符编码,以及文件的基本读取
一:字符编码 1)什么是字符编码 将人能识别的字符等高级标识符与计算机所能识别的二进制01进行转化,这之间的交流需要一个媒介,进行两种标识符之间的转化. 字节的存储方式为八个二进制位 2)乱码 存放数 ...
- Python不再为字符集编码发愁,使用chardet轻松解决你的困扰。
欢迎添加华为云小助手微信(微信号:HWCloud002 或 HWCloud003),输入关键字"加群",加入华为云线上技术讨论群:输入关键字"最新活动",获取华 ...
- 字符集编码与Python(一)编码历史
编码历史 ASCII ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于 ...
- 各种编码中汉字所占字节数;中文字符集编码Unicode ,gb2312 , cp936 ,GBK,GB18030
vim settings set fileencodings=utf-8,ucs-bom,gb18030,gbk,gb2312,cp936,latin1set termencoding=utf-8se ...
- 字符集编码Unicode ,gb2312 cp936
这是一篇程序员写给程序员的趣味读物.所谓趣味是指可以比较轻松地了解一些原来不清楚的概念,增进知识,类似于打RPG游戏的升级.整理这篇文章的动机是两个问题: 问题一:使用Windows记事本的“另存为” ...
- Python : 熟悉又陌生的字符编码(转自Python 开发者)
Python : 熟悉又陌生的字符编码 字符编码是计算机编程中不可回避的问题,不管你用 Python2 还是 Python3,亦或是 C++, Java 等,我都觉得非常有必要厘清计算机中的字符编码概 ...
- 中文字符集编码Unicode ,gb2312 , cp936 ,GBK,GB18030
中文字符集编码Unicode ,gb2312 , cp936 ,GBK,GB18030 cp936是微软自己发布的用在文件系统中的编码方式.而bg2312是中国国家标准.我明白mount -t vfa ...
- 基于Python的数据分析(2):字符串编码
在上一篇文章<基于Python的数据分析(1):配置安装环境>中的第四个步骤中我们在python的启动步骤中强制要求加载sitecustomize.py文件并设置其默认编码为"u ...
- {MySQL数据库初识}一 数据库概述 二 MySQL介绍 三 MySQL的下载安装、简单应用及目录介绍 四 root用户密码设置及忘记密码的解决方案 五 修改字符集编码 六 初识sql语句
MySQL数据库初识 MySQL数据库 本节目录 一 数据库概述 二 MySQL介绍 三 MySQL的下载安装.简单应用及目录介绍 四 root用户密码设置及忘记密码的解决方案 五 修改字符集编码 六 ...
随机推荐
- 使用ZBar来读取条形码和二维码的方法
版权声明:本文为博主原创文章,未经博主允许不得转载. 1.使用ZBar项目.下载地址是: http://zbar.sourceforge.net/iphone/index.html 2.新建一个项目. ...
- 自己动手搞定支付宝手机Wap网站支付接口 FOR ECShop
支付宝WAP网站版本的支付接口网上整合的比较少,看到很多网站在卖,顿觉无语. 主要是得自己查看支付宝官方提供的SDK中的开发文档. 支付宝sdk下载地址:https://doc.open.alipay ...
- org.apache.jasper.JasperException: The absolute uri: http://java.sun.com/jsp/jstl/core cannot be resolved in ……
编程中遇到:org.apache.jasper.JasperException: The absolute uri: http://java.sun.com/jsp/jstl/core cannot ...
- CAP定理(原则)以及BASE理论
CAP定理(原则)以及BASE理论 CAP定理(原则)概念 CAP原则又称CAP定理,指的是在一个分布式系统中, Consistency(一致性). Availability(可用性).Partiti ...
- Cocos3.0 的android返回键功能实现
比如:Game.h Game.cpp 头文件Game.h中定义: void onKeyReleased(EventKeyboard::KeyCode keyCode,Event * pEvent) ...
- expr判断整数是相加的值,返回命令的返回值$? 是0,但是少数情况是1,例如1 + -1 ,$? 的结果是1 ,判断要大于1最准确
[root@m01 ~]# expr 1 + 12[root@m01 ~]# echo $?0[root@m01 ~]# echo 1 - 51 - 5[root@m01 ~]# expr 1 - 5 ...
- 【转】Oracle Sys和system用户、sysdba 和sysoper系统权
一:最重要的区别,存储的数据的重要性不同 [sys]所有oracle的数据字典的基表和视图都存放在sys用户中,这些基表和视图对于oracle的运行是至关重要的,由数据库自己维护,任何用户都不能手动更 ...
- freemarker 超出字符用省略号表示
<#if x.content?length lt 200> ${x.content} <#else> ${x.content[0..201]}... </#if>
- .NET开发笔记--对config文件的操作(3)
1.添加新节点前进行判断看是否已存在相同的属性值,若存在进行更新,不存在则进行添加操作. protected bool AddPizza() { //初始化id int newId; string f ...
- 用python解析html--SGMLParser
sgmllib.py 包含一个重要的类: SGMLParser.SGMLParser 将 HTML 分解成有用的片段, 比如开始标记和结束标记.一旦它成功地分解出某个数据为一个有用的片段,它会根据 所 ...