使用python处理中文csv文件,并让excel正确显示中文(避免乱码)
2016-07-18 11:43
1001 查看
使用python2处理中文时,经常会出现乱码问题,之前使用python处理中文csv文件时,处理过程程序输出出现了乱码,最后在程序中能够正常显示出中文,但是导出文件时,使用excel打开出现了中文乱码问题,但是使用ultraedit打开时,能正常显示。现在找到了问题的所在,总结如下:
1)程序输出中出现乱码的原因是因为python2中中文编码的问题,需要注意的是要将处理的中文文件的编码和python源文件的编码保持一致,这样不会出现中文乱码。可以参考这两篇文章关于Python脚本开头两行的:#!/usr/bin/python和#
-*- coding: utf-8 -*-的作用 – 指定和Python中用encoding声明的文件编码和文件的实际编码之间的关系
2)在程序中能够正常输出中文,但是导出到文件后使用excel打开是出现中文乱码是因为excel能够正确识别用gb2312、gbk、gb18030或utf_8 with BOM 编码的中文,如果是utf_8 no BOM编码的中文文件,excel打开会乱码。
根据以上两点,结合自己的情况:我使用的是jupyter的ide,创建的python源文件为utf8 no BOM格式的编码,而要处理的csv文件是用gbk编码的,所以我需要将使用gbk编码的csv文件转为utf_8编码。
使用上面的代码能够将使用GBK编码的文件转为UTF8编码的文件。接下来就是真正处理csv文件了。
处理csv文件:
将data导出到文件中:
使用excel打开result_utf8_no_bom.csv和result_utf8_with_bom.csv,发现能够正确识别result_utf8_with_bom.csv文件
1)程序输出中出现乱码的原因是因为python2中中文编码的问题,需要注意的是要将处理的中文文件的编码和python源文件的编码保持一致,这样不会出现中文乱码。可以参考这两篇文章关于Python脚本开头两行的:#!/usr/bin/python和#
-*- coding: utf-8 -*-的作用 – 指定和Python中用encoding声明的文件编码和文件的实际编码之间的关系
2)在程序中能够正常输出中文,但是导出到文件后使用excel打开是出现中文乱码是因为excel能够正确识别用gb2312、gbk、gb18030或utf_8 with BOM 编码的中文,如果是utf_8 no BOM编码的中文文件,excel打开会乱码。
根据以上两点,结合自己的情况:我使用的是jupyter的ide,创建的python源文件为utf8 no BOM格式的编码,而要处理的csv文件是用gbk编码的,所以我需要将使用gbk编码的csv文件转为utf_8编码。
import codecs def ReadFile(filePath,encoding): with codecs.open(filePath,"r",encoding) as f: return f.read() def WriteFile(filePath,u,encoding): with codecs.open(filePath,"w",encoding) as f: f.write(u) ''' 定义GBK_2_UTF8方法,用于转换文件存储编码 ''' def GBK_2_UTF8(src,dst): content = ReadFile(src,encoding='gbk') WriteFile(dst,content,encoding='utf_8') ''' qyx.csv文件使用GBK编码存储,现在将其转为UTF_8存储 ''' src = 'qyx.csv' dst = 'qyx_utf8.csv' GBK_2_UTF8(src,dst)
使用上面的代码能够将使用GBK编码的文件转为UTF8编码的文件。接下来就是真正处理csv文件了。
import pandas as pd from urllib import unquote ''' 读取转换存储格式后的文件 ''' path = 'qyx_utf8.csv' data = pd.read_csv(path,) data.head()
处理csv文件:
''' 使用unquote方法对第三列的url进行decode ''' #data['newcol'] = data[u'关键词代码'].map(unquote) #这样会导致key识别错误,正确做法应该是去掉u data['newcol'] = data['关键词代码'].map(unquote)#也可以使用ix来取得第三列的数据 #data['newcol'] = data.ix[:,3].map(unquote) data.head()
将data导出到文件中:
''' 将结果导出到result.csv中,以UTF_8 with BOM编码(微软产品能正确识别UTF_8 with BOM存储的中文文件)存储 ''' #data.to_csv('result_utf8_no_bom.csv',encoding='utf_8')#导出的结果不能别excel正确识别 data.to_csv('result_utf8_with_bom.csv',encoding='utf_8_sig')
使用excel打开result_utf8_no_bom.csv和result_utf8_with_bom.csv,发现能够正确识别result_utf8_with_bom.csv文件
相关文章推荐
- Python动态类型的学习---引用的理解
- Python3写爬虫(四)多线程实现数据爬取
- 垃圾邮件过滤器 python简单实现
- 下载并遍历 names.txt 文件,输出长度最长的回文人名。
- install and upgrade scrapy
- Scrapy的架构介绍
- Centos6 编译安装Python
- 使用Python生成Excel格式的图片
- 让Python文件也可以当bat文件运行
- [Python]推算数独
- Python中zip()函数用法举例
- Python中map()函数浅析
- Python将excel导入到mysql中
- Python在CAM软件Genesis2000中的应用
- 使用Shiboken为C++和Qt库创建Python绑定
- FREEBASIC 编译可被python调用的dll函数示例
- Python 七步捉虫法