如何在Python中确定文件的编码?

29 投票
5 回答
50149 浏览
提问于 2025-04-15 18:31

有没有人知道怎么在Python中获取一个文件的编码方式?我知道可以用codecs模块来打开一个特定编码的文件,但前提是你得提前知道这个编码。

import codecs
f = codecs.open("file.txt", "r", "utf-8")

有没有办法自动检测一个文件使用的编码是什么?

谢谢大家的帮助!

补充: 感谢大家提供的有趣答案。你们可能还会对这个网站感兴趣:http://whatismyencoding.com/,它是基于chardet的(而且这个网站是用bottle这个Python框架搭建的)。

5 个回答

5

这里有一小段代码,可以帮助你猜测文本的编码方式。它在latin1和utf8之间的判断效果不错。这个代码可以把字节字符串转换成Unicode字符串。

# Attention: Order of encoding_guess_list is import. Example: "latin1" always succeeds.
encoding_guess_list=['utf8', 'latin1']
def try_unicode(string, errors='strict'):
    if isinstance(string, unicode):
        return string
    assert isinstance(string, str), repr(string)
    for enc in encoding_guess_list:
        try:
            return string.decode(enc, errors)
        except UnicodeError, exc:
            continue
    raise UnicodeError('Failed to convert %r' % string)
def test_try_unicode():
    for start, should in [
        ('\xfc', u'ü'),
        ('\xc3\xbc', u'ü'),
        ('\xbb', u'\xbb'), # postgres/psycopg2 latin1: RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
        ]:
        result=try_unicode(start, errors='strict')
        if not result==should:
            raise Exception(u'Error: start=%r should=%r result=%r' % (
                    start, should, result))
8

你可以使用字节顺序标记(BOM)来检测编码,或者试试这个库:

https://github.com/chardet/chardet

25

很遗憾,没有一种“正确”的方法可以仅通过查看文件本身来判断文件的编码。这是一个普遍存在的问题,不仅仅是Python或者某个特定的文件系统会遇到。

如果你在读取一个XML文件,文件的第一行可能会给你一些关于编码的线索。

否则,你就得使用一些基于经验的方法,比如chardet(这是其他回答中提到的解决方案之一),它会通过检查文件中的原始字节数据来猜测编码。如果你在Windows上,我相信Windows的API也提供了一些方法,可以根据文件中的数据来尝试猜测编码。

撰写回答