3

処理したい実際のファイルのコンテナである txt ファイルの大規模なコレクションを処理しようとしています。txt ファイルには、処理している個々のファイルの境界を設定する sgml タグがあります。含まれているファイルは、uuencode されたバイナリである場合があります。uuencoded ファイルのデコードの問題は解決しましたが、解決策を熟考していたときに、十分に一般的ではないと判断しました。つまり、今まで使っていた

if '\nbegin 644 ' in document['document']

ファイルが uuencode されているかどうかをテストします。私はいくつかの検索を行い、644 が何を意味するか (ファイルのアクセス許可) を漠然と理解していました。

if '\nbegin 642 ' in document['document']

または他のいくつかの代替品でさえ。したがって、私の問題は、uuencode ファイルを含むすべてのサブコンテナを確実にキャプチャ/識別する方法です。

1 つの解決策は、すべてのサブコンテナーをテストすることです。

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 の結果であるかどうかを認識するより堅牢な方法はありますか?

4

2 に答える 2

2

ウィキペディアによると、すべてのuuencodeファイルはこの行で始まります

begin <perm> <name>

したがって、おそらく正規表現に一致する行^begin [0-7]{3} (.*)$は、十分に確実に開始を示します。

于 2011-01-11T21:39:39.703 に答える
1

ふたつのやり方:

(1) Unix ベースのシステムでは、コマンドを確実に使用できますfile

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

$ file foo
foo: uuencoded or xxencoded text

(2) 次の (テストされていない) Pythonコードも見つかりました。

#!/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()
于 2011-01-11T21:35:43.573 に答える