尝试确定文件是否已经进行了 uuencode 编码

3

我正在尝试处理大量的txt文件,这些文件本身是我想要处理的实际文件的容器。这些txt文件有sgml标记,用于设置我正在处理的各个文件的边界。有时,这些包含的文件是经过uuencode编码的二进制文件。我已经解决了解码uuencode文件的问题,但在思考我的解决方案时,我确定它不够通用。也就是说,我一直在使用

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

测试文件是否为uu编码。我进行了一些搜索,并对644的含义(文件权限)有了模糊的理解,然后找到了其他可能具有uu编码文件的示例。

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

甚至还有其他替代方案。因此,我的问题是如何确保捕获/识别所有包含uuencoded文件的子容器。

一个解决方案是测试每个子容器:

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个回答

2
维基百科表示,每个 uuencode 文件都以这一行开头。
begin <perm> <name>

所以,也许与正则表达式^begin [0-7]{3} (.*)$匹配的行足以可靠地表示开始。

我很欣赏这个想法。但我担心我没有得到太多的想法,而是试图解码文件,因为我必须运行正则表达式。 - PyNEwbie
编译后的正则表达式匹配(或失败)非常快。也许 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) 我还发现了以下(未经测试的)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()

除了在“开始”之前有内容的文件 - 大多数uudecoder都会跳过这些文件。 “file”可能会将它们报告为Ascii文本。不要担心你在Windows上,获取Cygwin,然后您就可以拥有所有Unix好东西。 - Spacedman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接