UTF8,Unicode和二进制数据读取的麻烦

时间:2017-03-31 19:36:56

标签: python unicode utf-8

我一直在使用脚本来读取文件,提取和索引某些字符串。一切都很顺利,除了文件编码的一个问题。

我会尝试恢复:

我的脚本从文件中读取数据块,将这些块转换为小写并进行规范化以使用unicodedata.normalize删除替换特殊字符(ç,á,é,ã等):

unicodedata.normalize("NFKD",chunk.decode("utf8","ignore")).encode("ascii","ignore").lower()

在这种情况下,字符串“Olá,comovaivocê?Vamoscaçar?”会导致“Ola,como vai voce?Vamos cacar?”它与UTF8编码的文本文件一起正常工作,但在尝试从二进制文件(如MS .doc文件)中检索字符串时失败。使用上面相同的代码,将返回一个字符串“Ol,como vai voc?Vamos caar?”

我已经设法使用unicode-escape使用MS .doc文件(但它会因UTF8文件而失败)。

unicodedata.normalize("NFKD",chunk.decode("unicode-escape","ignore")).encode("ascii","ignore").lower()

经过20多个小时的研究后,我还没有办法在两种情况下都能运行我的脚本。

不幸的是,我无法使用外部模块。

1 个答案:

答案 0 :(得分:0)

您需要对脚本进行参数化。您应该将编码指定为您调用它的参数。如果您已将文件名指定为参数,则它将如下所示:

$ python your_script.py input-file.txt utf8

阅读这样的论点:

input_file, encoding = sys.argv[1:]

然后将编码修改行更改为:

unicodedata.normalize("NFKD", chunk.decode(encoding, "ignore")).encode("ascii", "ignore").lower()

也许有一种方法可以用其他方式猜测编码(例如,如果所有文件都以" .doc"结尾),那么你可以跳过命令行参数。