有没有办法在 Python 中识别文本文件是否为 UTF-8?
我真的很想知道文件是否为 UTF-8。我不需要检测其他编码。
有没有办法在 Python 中识别文本文件是否为 UTF-8?
我真的很想知道文件是否为 UTF-8。我不需要检测其他编码。
您在评论中提到您只需要检测 UTF-8。如果您知道替代方案仅包含单字节编码,那么有一个通常有效的解决方案。
如果您知道它是 UTF-8 或单字节编码latin-1
,请先尝试以 UTF-8 格式打开,然后再以其他编码格式打开。如果文件仅包含 ASCII 字符,则即使它原本打算作为其他编码,它最终也会以 UTF-8 打开。如果它包含任何非 ASCII 字符,这几乎总是能正确检测到两者之间的正确字符集。
try:
# or codecs.open on Python <= 2.5
# or io.open on Python > 2.5 and <= 2.7
filedata = open(filename, encoding='UTF-8').read()
except:
filedata = open(filename, encoding='other-single-byte-encoding').read()
最好的办法是直接使用chardet
来自 PyPI 的包,或者通过UnicodeDamnit
BeautifulSoup 使用包:
夏德 1.0.1
通用编码检测器
检测:
- ASCII、UTF-8、UTF-16(2 个变体)、UTF-32(4 个变体)
- Big5、GB2312、EUC-TW、HZ-GB-2312、ISO-2022-CN(繁简体中文)
- EUC-JP、SHIFT_JIS、ISO-2022-JP(日语)
- EUC-KR、ISO-2022-KR(韩文)
- KOI8-R、MacCyrillic、IBM855、IBM866、ISO-8859-5、windows-1251(西里尔文)
- ISO-8859-2、windows-1250(匈牙利语)
- ISO-8859-5、windows-1251(保加利亚)
- windows-1252(英文)
- ISO-8859-7、windows-1253(希腊语)
- ISO-8859-8、windows-1255(视觉和逻辑希伯来语)
- TIS-620(泰语)
需要 Python 2.1 或更高版本
但是,某些文件将在多种编码中有效,因此chardet
不是灵丹妙药。
可靠吗?不。
一般来说,一个字节序列没有意义,除非你知道如何解释它——这适用于文本文件,也适用于整数、浮点数等。
但是,有一些方法可以猜测文件的编码,通过查看字节顺序标记(如果有的话)和文件的第一个块(查看哪种编码产生最合理的字符)。该chardet
库在这方面做得很好,但请注意它只是一种启发式方法,尽管它相当强大。