如何在Python中确定文件的编码?
有没有人知道怎么在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)来检测编码,或者试试这个库:
25
很遗憾,没有一种“正确”的方法可以仅通过查看文件本身来判断文件的编码。这是一个普遍存在的问题,不仅仅是Python或者某个特定的文件系统会遇到。
如果你在读取一个XML文件,文件的第一行可能会给你一些关于编码的线索。
否则,你就得使用一些基于经验的方法,比如chardet(这是其他回答中提到的解决方案之一),它会通过检查文件中的原始字节数据来猜测编码。如果你在Windows上,我相信Windows的API也提供了一些方法,可以根据文件中的数据来尝试猜测编码。