2017-03-31 55 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