Как отделить контент от файла, который является контейнером для двоичного и других форм контента - PullRequest
2 голосов
/ 05 мая 2009

Я пытаюсь разобрать некоторые файлы .txt. Эти файлы служат контейнерами для переменного числа дочерних файлов, которые выделяются или идентифицируются в контейнере с помощью тегов SGML. С помощью Python я могу легко отделить дочерние файлы. Однако у меня возникли проблемы с записью двоичного содержимого обратно в виде двоичного файла (например, GIF или JPG). В простейшем случае контейнер может иметь встроенный html-файл, за которым следует графическое изображение, вызываемое html. Я предполагаю, что моя проблема в том, что я читаю оригинальный файл .txt, используя open (filename, 'r'). Но это кажется единственной возможностью найти теги sgml для разделения файла.

Буду признателен за помощь в поиске подходящего материала для чтения.

Я ценю предложения, но я все еще борюсь с самыми основными вопросами. Например, когда я открываю файл с помощью wordpad и прокручиваю вниз до раздела, помеченного как gif, я вижу это:

<FILENAME>h65803h6580301.gif
<DESCRIPTION>GRAPHIC
<TEXT>
begin 644 h65803h6580301.gif
M1TE&.#EA(P)I`=4@`("`@,#`P$!`0+^_OW]_?_#P\*"@H.#@X-#0T&!@8!`0
M$+"PL"`@('!P<)"0D#`P,%!04#\_/^_O[Y^?GZ^OK]_?WX^/C\_/SV]O;U]?

Я могу легко найти раздел, но где начинается gif-файл. Заголовок начинается с 644, пробелы после слова начинаются или строка начинается с MITE?

Далее, когда файл читается в python, он что-нибудь делает с двоичным кодом, который должен быть отменен, когда его читают обратно?

Я могу найти строки, где начинается графика:

filerefbin=file('myfile.txt','rb')
wholeFile=filerefbin.read()
import re
graphicReg=re.compile('<DESCRIPTION>GRAPHIC')
locationGraphics=graphicReg.finditer(wholeFile)
graphicsTags=[]
for match in locationGraphics:
    graphicsTags.append(match.span())

Я могу легко использовать тот же процесс, чтобы добраться до начала слова или определить имя файла и добраться до конца имени файла в первой строке. Я также успешно дошел до конца встроенного файла GIF. Но я не могу написать правильную комбинацию вещей, поэтому, когда я дважды щелкаю h65803h6580301.gif, когда он был изолирован и сохранен, я получаю изображение.

Интересно, что когда я открываю файл в rb, концы строк, кажется, все еще присутствуют, даже если они не оказывают никакого влияния на блокнот. Так что это, очевидно, одна из моих проблем, которые мне могут понадобиться, чтобы прочитать строки и соединить строки после удаления \ n

Мне нравится этот сайт, и я люблю PYTHON

Это было слишком легко, когда я прочитал пост Бендина. Мне просто нужно было отрезать раздел, который начинался со слова begin, и сохранить его в текстовом файле, а затем выполнить следующую команду:

import uu
uu.decode(r'c:\test2.txt',r'c:\test.gif')

Я должен поработать с некоторыми другими вещами до конца дня, но я опубликую больше здесь, когда я посмотрю на это более внимательно. Первое, что мне нужно выяснить, - это как использовать что-то, кроме файла, то есть, поскольку я прочитал весь файл .txt в память и вырезал раздел, содержащий изображение, которое мне нужно для работы с вырезанным разделом, а не записывал его на test2.txt. Я уверен, что это можно сделать, просто выяснив, как это сделать.

Ответы [ 3 ]

3 голосов
/ 05 мая 2009

То, на что вы смотрите, это не "двоичный файл", это uuencoded . Стандартная библиотека Python включает в себя модуль uu для обработки uuencoded данных.

Модуль uu требует использования временных файлов для кодирования и декодирования. Вы можете сделать это, не прибегая к временным файлам, используя модуль Python codecs , например:

import codecs

data       = "Let's just pretend that this is binary data, ok?"
uuencode   = codecs.getencoder("uu")
data_uu, n = uuencode(data)
uudecode   = codecs.getdecoder("uu")
decoded, m = uudecode(data_uu)

print """* The initial input:
%(data)s
* Encoding these %(n)d bytes produces:
%(data_uu)s
* When we decode these %(m)d bytes, we get the original data back:
%(decoded)s""" % globals()
2 голосов
/ 05 мая 2009

Вам обязательно нужно читать в двоичном режиме, если содержимое содержит изображения JPEG.

Кроме того, Python включает в себя синтаксический анализатор SGML, http://docs.python.org/library/sgmllib.html.

Там нет примера, но все, что вам нужно, это настроить методы do_ для обработки желаемых тегов sgml.

0 голосов
/ 05 мая 2009

Вам нужно open(filename,'rb'), чтобы открыть файл в двоичном режиме. Имейте в виду, что это приведет к тому, что в некоторых операционных системах python даст вам запутанные двухбайтовые окончания строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...