私は処理したい実際のファイルのコンテナである大量のtxtファイルを処理しようとしています。 txtファイルには、処理中の個々のファイルの境界を設定するsgmlタグがあります。場合によっては、含まれているファイルがuuencodeされたバイナリです。私はuuencodeされたファイルを解読する問題を解決しましたが、私が解決策を検討していたとき、私は一般的ではないと判断しました。つまり、ファイルをuuencodeしているかどうかをテストするには、ファイルがuuencodeされているかどうかを確認しようとしています
if '\nbegin 644 ' in document['document']
を使用しています。私はいくつかの検索を行なったし、何644の手段(ファイルパーミッション)の漠然と理解しているし、その後
if '\nbegin 642 ' in document['document']
、あるいは他のいくつかの交替があるかもしれないuuencodeされたファイルの他の例を発見しました。したがって、私の問題は、Uuencodeされたファイルを持つすべてのサブコンテナをキャプチャ/特定する方法を確認することです。
一つの解決策は、すべてのサブコンテナをテストすることです:
uudecode=codecs.getdecoder("uu")
for document in documents:
try:
decoded_document,m=uudecode(document)
except ValueError:
decoded_document=''
if len(decoded_document)==0
more stuff
これは恐ろしいではありません、CPUサイクルは安いですが、私はいくつかの800万文書を処理するつもりです。
したがって、特定の文字列がuuencodingの結果であるかどうかを認識するためのより堅牢な方法がありますか?
私はこの考えに感謝します。私はregexpを実行する必要があるので、ファイルを解読しようとするのとは対照的に、あまり得意ではないと懸念しています。 – PyNEwbie
コンパイルされた正規表現は、非常に迅速に一致します(または失敗します)。たぶん、uudecodeが失敗し、すでにこの非常に重要なステップが含まれています。決定する唯一の方法は、2〜3千のファイルで実際に試し、より速いものを測定することです。 – 9000
ファイルは 'begin'で始める必要はありません。ほとんどの現代のuudecodeは最初のbeginまで何も無視します。これはおそらくメールをパイプに通すことができ、ヘッダーをフィルタリングする必要がないからです。 – Spacedman