2017-03-31 6 views
0

私はファイルを読み込んでいくつかの文字列を抽出してインデックスを作成するスクリプトで作業しています。ファイルのエンコーディングに関する1つの問題を除いて、すべてうまくいっています。UTF8、Unicodeとバイナリのデータ読み込みの問題

私は再開しようとします:ファイルからのデータの

マイスクリプト読んチャンクを、これらのチャンクを変換小文字や特殊文字を置き換える削除するために正規化する(A、E、A、C、など)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を使用してMS .docファイルを処理することができました(ただし、UTF8ファイルでは失敗します)。

20時間以上の研究の後、私はどちらの場合でもスクリプトを実行するソリューションがまだありません。

不幸にも、私は外部モジュールを使用できません。

+0

あなたは 'unicodedata.normalize'を呼び出す前にあなたはあまりにも多くの仕事をしているようです。あなたは他の何よりも先に正規化を行うことができますか?これはうまくいけば、エンコード/デコードが動作するための一貫したデータセットを生成するはずです。 –

+1

"MS .docファイルのようなバイナリファイルの文字列"は常にUTF-8エンコードされていますか?そうでない場合は、別のコード体系でデコードする必要があります。 AFAIK、その周りに方法はありません。したがって、コードは各入力のエンコーディングを知る必要があります(たとえば、ソースとそのソースのエンコーディングを知ることによって)。 –

+0

@AustinHastingsデコードする前に正規化することは意味がありません。バイトシーケンスをユニコードで正規化することはできません。 – lenz

答えて

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"で終わる場合)、コマンドライン引数をスキップできます。

+0

また、異なるエンコーディングをテストするのが簡単になります。質問のコメントから 'unicode-escape'が.docファイルの正しい選択ではない可能性があることが示唆されています。 – lenz