最近参加了由CCF举办的数据挖掘比赛,主办方提供了csv格式的数据文件,由于中文显示乱码的问题,我先用txt文本编辑器将编码改为utf-8格式,但是在读取文件并输出读取结果时发生了问题,代码如下:
1 # -*- coding:utf-8 -*- 2 __author__ = 'Jz' 3 4 csvPath = 'D:/coding_file/python_file/Big Data/trainUTF8.csv' 5 try: 6 csv = open(csvPath, 'r') 7 lines = csv.readlines() 8 for line in lines: 9 print line.decode('utf-8').encode('GBK') 10 except IOError, ioe: 11 if hasattr(e, 'reason'): 12 print '文件打开失败,失败原因:' + e.reason
运行结果如下:
显然根据结果来看问题具体出现在print line.decode('utf-8').encode('GBK')这里,按理说应该是没有问题的,那么问题到底出现在哪里?
后来搜索了很多相关资料,解决了问题,总结如下:Windows系统的txt文件在使用utf-8编码保存时会默认在文件开头插入三个不可见字符,称为BOM头,这个BOM头在python的codecs库中已经定义为常量。Windows根据BOM头来判断txt文件是否为utf-8编码,所以在读取文件时必须将BOM头去除或者忽略,否则python在decode和encode时会出现错误。
解决方法:
1 # -*- coding:utf-8 -*- 2 __author__ = 'Jz' 3 4 import codecs 5 6 csvPath = 'D:/coding_file/python_file/Big Data/trainUTF8.csv' 7 try: 8 csv = open(csvPath, 'r') 9 lines = csv.readlines() 10 for line in lines: 11 print line.decode('utf-8').encode('gbk', 'ignore') 12 except IOError, ioe: 13 if hasattr(e, 'reason'): 14 print '文件打开失败,失败原因:' + e.reason
ignore参数表示忽略其中有异常的编码,仅显示有效的编码