Python实现把utf-8格式的文件转换成gbk格式的文件


Posted in Python onJanuary 22, 2015

需求:将utf-8格式的文件转换成gbk格式的文件

实现代码如下:

def ReadFile(filePath,encoding="utf-8"):

    with codecs.open(filePath,"r",encoding) as f:

        return f.read()

 

def WriteFile(filePath,u,encoding="gbk"):

    with codecs.open(filePath,"w",encoding) as f:

        f.write(u)

 

def UTF8_2_GBK(src,dst):

    content = ReadFile(src,encoding="utf-8")

    WriteFile(dst,content,encoding="gbk")

代码讲解:

函数ReadFile的第二个参数指定以utf-8格式的编码方式读取文件,返回的结果content为Unicode然后,在将Unicode以gbk格式写入文件中。

这样就能实现需求。
但是,如果要转换格式的文件中包含有一些字符并不包含在gbk字符集中的话,就会报错,类似如下:

UnicodeEncodeError: 'gbk' codec can't encode character u'\xa0' in position 4813: illegal multibyte sequence

以上的报错信息的意思是:在将Unicode编码成gbk的时候,不能将Unicode u'\xa0'编码成gbk。

这里,我们需要弄清楚gb2312、gbk和gb18030三者之间的关系

GB2312:6763个汉字

GBK:21003个汉字

GB18030-2000:27533个汉字

GB18030-2005:70244个汉字

所以,GBK是GB2312的超集,GB18030是GBK的超集。
理清了关系之后,我们进一步改进下代码:
def UTF8_2_GBK(src,dst):

    content = ReadFile(src,encoding="utf-8")

    WriteFile(dst,content,encoding="gb18030")

运行后,发现没有报错,可以正常运行。

因为,在GB18030字符集中,可以找到u'\xa0'对应的字符。
 此外,还有另外一种实现方案:
需要修改下WriteFile方法

def WriteFile(filePath,u,encoding="gbk"):

    with codecs.open(filePath,"w") as f:

        f.write(u.encode(encoding,errors="ignore"))

这里,我们将Unicode编码(encode)成gbk格式,但是注意encode函数的第二个参数,我们赋值"ignore",表示在编码的时候,忽略掉那些无法编码的字符,解码同理。

但是,当我们执行后,发现可以成功的将utf-8格式的文件修改成了ansi格式。但,另外发现生成的文件中,每个一行都有一行空行。

这里,可以指定以二进制流的形式写文件,修改后的代码如下:

def WriteFile(filePath,u,encoding="gbk"):

    with codecs.open(filePath,"wb") as f:

        f.write(u.encode(encoding,errors="ignore"))
Python 相关文章推荐
python获取各操作系统硬件信息的方法
Jun 03 Python
Python基础教程之内置函数locals()和globals()用法分析
Mar 16 Python
Python实现将json文件中向量写入Excel的方法
Mar 26 Python
Python Unittest自动化单元测试框架详解
Apr 04 Python
Python实现多线程的两种方式分析
Aug 29 Python
详解如何管理多个Python版本和虚拟环境
May 10 Python
使用pyinstaller打包PyQt4程序遇到的问题及解决方法
Jun 24 Python
Python中字符串List按照长度排序
Jul 01 Python
python psutil模块使用方法解析
Aug 01 Python
python通过实例讲解反射机制
Oct 17 Python
python如何导出微信公众号文章方法详解
Aug 31 Python
python opencv实现直线检测并测出倾斜角度(附源码+注释)
Dec 31 Python
python中实现php的var_dump函数功能
Jan 21 #Python
Python实现获取网站PR及百度权重
Jan 21 #Python
Python实现抓取页面上链接的简单爬虫分享
Jan 21 #Python
Python中多线程及程序锁浅析
Jan 21 #Python
Python实现的多线程端口扫描工具分享
Jan 21 #Python
Python中的pprint折腾记
Jan 21 #Python
通过C++学习Python
Jan 20 #Python
You might like
php实现编辑和保存文件的方法
2015/07/20 PHP
js 纯数字不重复排列的另类方法
2010/07/17 Javascript
js通过googleAIP翻译PHP系统的语言配置的实现代码
2011/10/17 Javascript
js原型继承的两种方法对比介绍
2014/03/30 Javascript
单元选择合并变色示例代码
2014/05/26 Javascript
最流行的Node.js精简型和全栈型开发框架介绍
2015/02/26 Javascript
配置Grunt的Task时通配符支持和动态生成文件名问题
2015/09/06 Javascript
jQuery插件之Tocify动态节点目录菜单生成器附源码下载
2016/01/08 Javascript
javascript HTML5文件上传FileReader API
2020/03/27 Javascript
jQuery事件的绑定、触发、及监听方法简单说明
2016/05/10 Javascript
jquery获取input type=text中的值的各种方式(总结)
2016/12/02 Javascript
jQuery基于ajax操作json数据简单示例
2017/01/05 Javascript
详解Angularjs在控制器(controller.js)中使用过滤器($filter)格式化日期/时间实例
2017/02/17 Javascript
JS获得一个对象的所有属性和方法实例
2017/02/21 Javascript
原生JavaScript实现Tooltip浮动提示框特效
2017/03/07 Javascript
js中toString()和String()区别详解
2017/03/23 Javascript
jquery animate动画持续运动的实例
2017/11/29 jQuery
EasyUI的DataGrid绑定Json数据源的示例代码
2017/12/16 Javascript
基于vue v-for 循环复选框-默认勾选第一个的实现方法
2018/03/03 Javascript
详解VUE单页应用骨架屏方案
2019/01/17 Javascript
详解ES6中的Map与Set集合
2019/03/22 Javascript
vue-devtools的安装和使用步骤详解
2019/10/17 Javascript
操作Windows注册表的简单的Python程序制作教程
2015/04/07 Python
python中正则表达式与模式匹配
2019/05/07 Python
Python Excel处理库openpyxl使用详解
2019/05/09 Python
python2和python3应该学哪个(python3.6与python3.7的选择)
2019/10/01 Python
keras 读取多标签图像数据方式
2020/06/12 Python
使用pandas实现筛选出指定列值所对应的行
2020/12/13 Python
CSS3教程:新增加的结构伪类
2009/04/02 HTML / CSS
项目负责人任命书
2014/06/04 职场文书
应聘会计求职信
2014/06/11 职场文书
公司副总经理岗位职责
2014/10/01 职场文书
大学生上课迟到检讨书
2014/10/15 职场文书
拿破仑传读书笔记
2015/07/01 职场文书
物业公司管理制度
2015/08/05 职场文书
银行求职信怎么写
2019/06/20 职场文书