3

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

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

测试文件是否是uuencoded。我做了一些搜索,对 644 的含义(文件权限)有一个模糊的理解,然后找到了其他可能具有的 uuencoded 文件示例

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 的结果?

4

2 回答 2

2

维基百科说每个 uuencoded 文件都以这一行开头

begin <perm> <name>

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

于 2011-01-11T21:39:39.703 回答
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()
于 2011-01-11T21:35:43.573 回答