确定Python中文本的编码
我收到了一些编码的文本,但我不知道使用了什么字符集。 有没有一种方法来确定使用Python的文本文件的编码? 如何检测处理C#的文本文件的编码/代码页。
正确检测编码是不可能的 。
(来自chardet常见问题:)
但是,某些编码已针对特定语言进行了优化,语言不是随机的。 一些字符序列总是弹出,而其他序列没有意义。 一个英文流利的人打开报纸,发现“txzqJv 2!dasd0a QqdKjvz”会立即认出那不是英语(尽管它完全是由英文字母组成)。 通过研究大量“典型”文本,计算机算法可以模拟这种流畅性,并对文本的语言进行有教育的猜测。
chardet库使用该研究来尝试检测编码。 chardet是Mozilla中自动检测代码的一个端口。
你也可以使用UnicodeDammit。 它会尝试以下方法:
编制编码的另一个选择是使用libmagic(这是file命令的后面的代码)。 有大量的python绑定可用。
生活在文件源树中的python绑定可用作python-magic(或python3-magic)debian软件包。 如果可以通过执行以下操作来确定文件的编码:
import magic
blob = open('unknown-file').read()
m = magic.open(magic.MAGIC_MIME_ENCODING)
m.load()
encoding = m.buffer(blob) # "utf-8" "us-ascii" etc
在pypi上有一个同样命名但不兼容的python-magic pip包,它也使用libmagic。 它也可以通过以下方式获得编码:
import magic
blob = open('unknown-file').read()
m = magic.Magic(mime_encoding=True)
encoding = m.from_buffer(blob)
一些编码策略,请注意品味:
#!/bin/bash
#
tmpfile=$1
echo '-- info about file file ........'
file -i $tmpfile
enca -g $tmpfile
echo 'recoding ........'
#iconv -f iso-8859-2 -t utf-8 back_test.xml > $tmpfile
#enca -x utf-8 $tmpfile
#enca -g $tmpfile
recode CP1250..UTF-8 $tmpfile
您可能希望通过以循环的形式打开和读取文件来检查编码......但您可能需要先检查文件大小:
encodings = ['utf-8', 'windows-1250', 'windows-1252' ...etc]
for e in encodings:
try:
fh = codecs.open('file.txt', 'r', encoding=e)
fh.readlines()
fh.seek(0)
except UnicodeDecodeError:
print('got unicode error with %s , trying different encoding' % e)
else:
print('opening the file with encoding: %s ' % e)
break
链接地址: http://www.djcxy.com/p/46795.html