Python 正在尝试确定文件是否已被uu编码

Python 正在尝试确定文件是否已被uu编码,python,uuencode,uudecode,Python,Uuencode,Uudecode,我正在尝试处理大量txt文件,这些文件本身就是我想要处理的实际文件的容器。txt文件具有sgml标记,用于为我正在处理的各个文件设置边界。有时,包含的文件是经过uu编码的二进制文件。我已经解决了解码uuencoded文件的问题,但当我仔细考虑我的解决方案时,我发现它不够通用。也就是说,我一直在使用 if '\nbegin 644 ' in document['document'] 测试文件是否为UU编码。我做了一些搜索,对644的含义(文件权限)有一个模糊的理解,然后找到了其他可能有 if '

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

if '\nbegin 644 ' in document['document']
测试文件是否为UU编码。我做了一些搜索,对644的含义(文件权限)有一个模糊的理解,然后找到了其他可能有

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万个文档

因此,有没有更可靠的方法来识别特定字符串是否是UU编码的结果?

两种方法:

(1) 在基于Unix的系统上,您可以可靠地使用
文件
命令

(2) 我还发现了以下(未经测试的)Python代码,看起来它可以满足您的需要(至少)

每个uuencoded文件都从这一行开始

begin <perm> <name>
开始

因此,与regexp
^begin[0-7]{3}(.*)$
匹配的一行可能足够可靠地表示开始。

我欣赏这种想法。我担心我并没有得到太多,虽然相对于试图解码文件,因为我必须运行regexp.A编译regexp匹配(或失败)非常快。也许uudecode失败的速度也一样快,并且已经包括了这一步。确定的唯一方法是在2-3000个文件上实际试用它,并测量哪个更快。请注意,该文件不必以“开始”开头-大多数现代UU解码器在第一个开始之前都会忽略任何内容-这可能是为了让您可以直接将邮件输送到其中,而不必过滤掉标题。包含内容的文件除外在“开始”之前-大多数UU解码器都会跳过它“文件”可能会将这些报告为Ascii文本。不管你是在Windows上,获得Cygwin,然后你就可以拥有所有的Unix产品。
#!/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()
begin <perm> <name>