尝试判断文件是否已被uuencode编码

3 投票
2 回答
2001 浏览
提问于 2025-04-16 09:47

我正在处理一大堆文本文件,这些文本文件里其实包含了我想要处理的真正文件。这些文本文件里有一些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} (.*)$,可以比较可靠地表示文件的开始。

撰写回答