2011-01-11 40 views
3

我正在嘗試處理大量的txt文件,這些文件本身就是我想要處理的實際文件的容器。 txt文件具有sgml標籤,爲我正在處理的各個文件設置邊界。有時,包含的文件是二進制的,已經被編碼。我已經解決了解碼uuencoded文件的問題,但是當我在研究我的解決方案時,我確定它不夠通用。也就是說,我一直在使用試圖確定文件是否已被編碼

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

來測試該文件是否是uuencoded。我做了一些搜索,並有644個單元(文件權限)什麼是模糊的認識,並隨後發現,可能有

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

,甚至一些其他的候補的無編碼文件的其他例子。因此,我的問題是如何確保捕獲/識別所有具有未編碼文件的子容器。

解決辦法之一是測試每個子容器:

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 <perm> <name> 

所以可能匹配正則表達式^begin [0-7]{3} (.*)$行表示開始足夠可靠。

1

兩種方式:

(1)在基於Unix的系統,你可以穩健地使用file命令。

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

$ file foo 
foo: uuencoded or xxencoded text 

(2)我還發現了以下(未經測試)Python代碼,看起來像它會做你想要的(在http://ubuntuforums.org/archive/index.php/t-1304548.html)什麼。

#!/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

謝謝,我在windows – PyNEwbie 2011-01-11 21:44:35

+0

除了開始之前有內容的文件 - 大多數uudecoders會跳過。 '文件'可能會將這些文件報告爲Ascii Text。不要介意你在Windows上,得到Cygwin,然後你可以擁有所有Unix的好東西。 – Spacedman 2011-01-12 15:02:05