尝试判断文件是否已被uuencode编码
我正在处理一大堆文本文件,这些文本文件里其实包含了我想要处理的真正文件。这些文本文件里有一些sgml标签,用来划分我需要处理的单个文件。有时候,这些包含的文件是经过uu编码的二进制文件。我已经解决了如何解码这些uu编码文件的问题,但在思考我的解决方案时,我发现它并不够通用。也就是说,我一直在用
if '\nbegin 644 ' in document['document']
来判断文件是否是uu编码的。我查了一些资料,对644这个数字(文件权限)有了模糊的了解,还发现了一些其他的uu编码文件,它们可能有
if '\nbegin 642 ' in document['document']
甚至还有其他的变种。因此,我的问题是,如何确保我能捕捉到所有包含uu编码文件的子容器。
一个解决方案是测试每一个子容器:
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
这样做并不是特别糟糕,处理器的运算能力很便宜,但我需要处理大约800万个文档。
所以,有没有更好的方法来识别某个字符串是否是uu编码的结果呢?
2 个回答
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()
2
维基百科上说,每个经过uu编码的文件都是从这一行开始的。
begin <perm> <name>
所以,可能有一行符合这个规则 ^begin [0-7]{3} (.*)$
,可以比较可靠地表示文件的开始。