我一直在使用脚本来读取文件,提取和索引某些字符串。一切都很顺利,除了文件编码的一个问题。
我会尝试恢复:
我的脚本从文件中读取数据块,将这些块转换为小写并进行规范化以使用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多个小时的研究后,我还没有办法在两种情况下都能运行我的脚本。
不幸的是,我无法使用外部模块。
答案 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"结尾),那么你可以跳过命令行参数。