2017-03-31 54 views
0

我一直在脚本中读取文件,提取和索引一些字符串。一切都很好,除了一个文件编码问题。UTF8,Unicode和二进制数据读取麻烦

我将尝试恢复:从文件中的数据

我的脚本读取的块,将这些块为小写和规范删除替换特殊字符(C,A,E,A等)使用unicodedata.normalize :

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

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

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

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

经过20多个小时的研究,我还没有解决方案让我的脚本在两种情况下运行。

不幸的是我不能使用外部模块。

+0

在我看来,你在* unicodedata.normalize'之前做了太多的工作*。你能做任何事情之前的规范化吗?这应该有希望为编码/解码生成一组一致的数据。 –

+1

你的“来自二进制文件(如MS .doc文件)的字符串”总是使用UTF-8编码吗?如果不是,你需要用不同的编码方案对它们进行解码。 AFAIK,这是没有办法的。因此,您的代码必须知道每个输入的编码(例如,通过了解其源和编码源)。 –

+0

@AustinHastings在解码之前进行规范化并不合理。你不能unicode规范一个字节序列。 – lenz

回答

0

您需要参数化您的脚本。您应该将编码指定为您称之为的参数。如果您已经指定文件名作为参数,它应该是这样的:

$ python your_script.py input-file.txt utf8 

阅读这样的论点:

input_file, encoding = sys.argv[1:] 

然后将编码的mangling行更改为:

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

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

+0

此外,这将使测试不同的编码更容易 - 就您的问题的评论所建议的,“unicode-escape”可能不是.doc文件的正确选择。 – lenz