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批量修改文件后缀的方法
Jan 26 Python
django 自定义用户user模型的三种方法
Nov 18 Python
python实现傅里叶级数展开的实现
Jul 21 Python
Python 访问限制 private public的详细介绍
Oct 16 Python
Python多进程fork()函数详解
Feb 22 Python
Python warning警告出现的原因及忽略方法
Jan 31 Python
Tensorflow分批量读取数据教程
Feb 07 Python
python GUI库图形界面开发之PyQt5访问系统剪切板QClipboard类详细使用方法与实例
Feb 27 Python
Django中文件上传和文件访问微项目的方法
Apr 27 Python
关于python中remove的一些坑小结
Jan 04 Python
python区块链持久化和命令行接口实现简版
May 25 Python
Python find()、rfind()方法及作用
Dec 24 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
初学CAKEPHP 基础教程
2009/11/02 PHP
Django 中 cookie的使用
2017/08/17 PHP
Javascript的构造函数和constructor属性
2010/01/09 Javascript
EXTJS内使用ACTIVEX控件引起崩溃问题的解决方法
2010/03/31 Javascript
基于jquery的blockui插件显示弹出层
2011/04/14 Javascript
jquery 卷帘效果实现代码(不同方向)
2013/02/05 Javascript
javascript实现playfair和hill密码算法
2014/12/07 Javascript
ztree获取选中节点时不能进入可视区域出现BUG如何解决
2015/12/03 Javascript
详解JavaScript中localStorage使用要点
2016/01/13 Javascript
js原型链与继承解析(初体验)
2016/05/09 Javascript
jQuery原理系列-css选择器的简单实现
2016/06/07 Javascript
Vue项目中quill-editor带样式编辑器的使用方法
2017/08/08 Javascript
Angular4学习之Angular CLI的安装与使用教程
2018/01/04 Javascript
vue和webpack打包项目相对路径修改的方法
2018/06/15 Javascript
Vue前后端不同端口的实现方法
2018/09/19 Javascript
微信小程序中的canvas 文字断行和省略号显示功能的处理方法
2018/11/14 Javascript
微信小程序实现单个卡片左滑显示按钮并防止上下滑动干扰功能
2019/12/06 Javascript
Express 配置HTML页面访问的实现
2020/11/01 Javascript
[37:47]IG vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
python微元法计算函数曲线长度的方法
2018/11/08 Python
解决PyCharm控制台输出乱码的问题
2019/01/16 Python
在Python中使用Neo4j的方法
2019/03/14 Python
Django 中间键和上下文处理器的使用
2019/03/17 Python
Python批量修改图片分辨率的实例代码
2019/07/04 Python
Python for循环搭配else常见问题解决
2020/02/11 Python
python ImageDraw类实现几何图形的绘制与文字的绘制
2020/02/26 Python
利用CSS3实现毛玻璃效果示例源码
2016/09/25 HTML / CSS
一些关于MySql加速和优化的面试题
2014/01/30 面试题
大学生毕业的自我评价分享
2014/01/02 职场文书
平安家庭示范户事迹
2014/06/02 职场文书
2014年秋季开学典礼主持词
2014/08/02 职场文书
工伤事故赔偿协议书(标准)
2014/09/29 职场文书
实习介绍信模板
2015/01/30 职场文书
心得体会格式及范文
2016/01/25 职场文书
导游词之西安骊山
2019/12/03 职场文书
JavaGUI模仿QQ聊天功能完整版
2021/07/04 Java/Android