Python的open()
函数,打开含中文的文本文件时提示编码格式不对,打不开。虽然open()
有encoding参数,可以手工指定,但如果不手工打开文件看,我也不知道原本是什么编码。
text = open('filename', 'r', encoding='utf-8').readlines()
下面总结了用chardet
自动检测文本文件的编码方式,再根据检测结果来打开文件。如下:
import sys
import chardet
def readlines_from_file(filename):
# 先用read()按二进制读进来
file_byte = open(filename, 'rb').read()
# 再用chardet.detect()对二进制byte串进行检测
charset = chardet.detect(file_byte)
# 判断自动检测结果中的confidence,如果confidence太低,很可能就是检测不出来
if float(charset['confidence']) > 0.9:
# 按自动检测的编码做decode()
file_text = file_byte.decode(charset['encoding'])
# 把解码后的文件按行存到列表里,返回给后续代码处理
return file_text.split('\n')
else:
# confidence太低时,报错
print('Unknown file encoding')
return None
if __name__ == '__main__':
lines = readlines_from_file(sys.argv[1])
if lines:
print(lines[0])
由于输入二进制byte串太短,这种自动检测的方法有可能检测不出来。对于大文件反而比较准确。
所以,chardet
只能部分解决问题。
当然,我们常见的中文编码也不是很多,比如GB2312、GBK、GB18030、UTF8、UTF16(unicode)等。当然unicode也可能是utf32,再加上大小端。我们也可以用这些编码去逐个尝试打开。