自动检测文本文件的编码方式
专栏:ExASIC Nov. 10, 2024, 2:06 p.m. 42 阅读
用`chardet`自动检测文本文件的编码方式

问题

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,再加上大小端。我们也可以用这些编码去逐个尝试打开。

感谢阅读,更多文章点击这里:【专栏:ExASIC】
最新20篇 开设专栏