2011-01-11 9 views
3

私は処理したい実際のファイルのコンテナである大量の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の結果であるかどうかを認識するためのより堅牢な方法がありますか?

答えて

2

Wikipedia saysだから、おそらく正規表現^begin [0-7]{3} (.*)$に一致する行が確実に十分な始まりを意味します。

+0

私はこの考えに感謝します。私はregexpを実行する必要があるので、ファイルを解読しようとするのとは対照的に、あまり得意ではないと懸念しています。 – PyNEwbie

+0

コンパイルされた正規表現は、非常に迅速に一致します(または失敗します)。たぶん、uudecodeが失敗し、すでにこの非常に重要なステップが含まれています。決定する唯一の方法は、2〜3千のファイルで実際に試し、より速いものを測定することです。 – 9000

+1

ファイルは 'begin'で始める必要はありません。ほとんどの現代のuudecodeは最初のbeginまで何も無視します。これはおそらくメールをパイプに通すことができ、ヘッダーをフィルタリングする必要がないからです。 – Spacedman

1

二つの方法:

(1)UNIXベースのシステムでは、あなたは確実にfileコマンドを使用することができます。

http://unixhelp.ed.ac.uk/CGI/man-cgi?file

$ file foo 
foo: uuencoded or xxencoded text 

(2)また、私はそれはあなたが(http://ubuntuforums.org/archive/index.php/t-1304548.htmlで)やりたいだろうように見えます、次の(未テスト)Pythonコードを発見しました。すべてのuuencodeされたファイルは、この行

begin <perm> <name> 

で始まる

#!/usr/bin/env python 
import magic 
import sys 
filename=sys.argv[1] 
ms = magic.open(magic.MAGIC_NONE) 
ms.load() 
ftype = ms.file(filename) 
print ftype 
ms.close() 
+0

ありがとう、私は窓にいます – PyNEwbie

+0

'begin'の前に内容のあるファイルを除いて - ほとんどのuudecodersはスキップします。 'file'はこれらをAscii Textとして報告するでしょう。あなたはWindowsで気にすることなく、Cygwinを入手して、すべてのUnix製品を手に入れることができます。 – Spacedman

関連する問題