Попытка определить, был ли файл закодирован - PullRequest
3 голосов
/ 12 января 2011

Я пытаюсь обработать большую коллекцию txt-файлов, которые сами являются контейнерами для тех файлов, которые я хочу обработать.TXT-файлы имеют теги sgml, которые устанавливают границы для отдельных файлов, которые я обрабатываю.Иногда содержащиеся в них файлы представляют собой двоичные файлы, которые были закодированы.Я решил проблему декодирования uuencoded файлов, но когда я обдумывал свое решение, я решил, что оно недостаточно общее.То есть я использовал

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

, чтобы проверить, не закодирован ли файл.Я провел некоторый поиск и имел смутное представление о том, что означает 644 (права доступа к файлам), а затем нашел другие примеры файлов с uuencoded, которые могут иметь

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

или даже некоторые другие альтернативы.Таким образом, моя проблема заключается в том, как мне убедиться, что я перехватываю / идентифицирую все субконтейнеры, в которых есть файлы с кодировкой uuenco.

Одно из решений состоит в том, чтобы протестировать каждый субконтейнер:ужасно, процессорные циклы дешевы, но я собираюсь обработать около 8 миллионов документов.

Таким образом, существует ли более надежный способ распознать, является ли конкретная строка результатом uuencoding?

Ответы [ 2 ]

2 голосов
/ 12 января 2011

Википедия говорит , что каждый uuencoded файл начинается с этой строки

begin <perm> <name>

Так что, вероятно, строка, соответствующая регулярному выражению ^begin [0-7]{3} (.*)$, достаточно надежно обозначает начало.

1 голос
/ 12 января 2011

Два способа:

(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()
...