Python读取UTF-8编码文件并使用命令行执行时输出结果的问题

时间:2023-01-06 19:58:17

最近参加了由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

运行结果如下:

Python读取UTF-8编码文件并使用命令行执行时输出结果的问题

显然根据结果来看问题具体出现在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参数表示忽略其中有异常的编码,仅显示有效的编码