问题
Python的open()
函数,打开含中文的文本文件时提示编码格式不对,打不开。虽然open()
有encoding参数,可以手工指定,但如果不手工打开文件看,我也不知道原本是什么编码。
text = open('filename', 'r', encoding='utf-8').readlines()
一种解决方法
下面总结了用chardet
自动检测文本文件的编码方式,再根据检测结果来打开文件。如下:
import sys
import chardet
def readlines_from_file(filename):
file_byte = open(filename, 'rb').read()
charset = chardet.detect(file_byte)
if float(charset['confidence']) > 0.9:
file_text = file_byte.decode(charset['encoding'])
return file_text.split('\n')
else:
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,再加上大小端。我们也可以用这些编码去逐个尝试打开。