Como separar o conteúdo de um arquivo que é um recipiente para binário e outras de conteúdo

StackOverflow https://stackoverflow.com/questions/822161

Pergunta

Eu estou tentando analisar alguns arquivos .txt. Esses arquivos servem como recipientes para um número variável de arquivos 'crianças' que são definidas fora ou identificados dentro do recipiente com etiquetas SGML. Com python eu posso facilmente separar os arquivos crianças. No entanto, estou tendo problemas para escrever o conteúdo de volta binário como um arquivo binário (dizem que um gif ou jpg). No caso mais simples o recipiente pode ter um arquivo html incorporado seguido por um gráfico que é chamado pelo html. Estou assumindo que o meu problema é porque eu estou lendo o arquivo .txt original usando open (filename, 'r'). Mas isso parece ser a única opção para encontrar as tags SGML para dividir o arquivo.

Eu gostaria de receber qualquer ajuda para identificar algum material de leitura relevante.

Agradeço as sugestões, mas eu ainda estou lutando com a maioria das perguntas básicas. Por exemplo, quando eu abrir o arquivo com o WordPad e desça até a seção marcado como um gif eu vejo isso:

<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]?

Eu posso lidar com encontrar a seção com bastante facilidade, mas onde é que o arquivo GIF começar. Será o início de cabeçalho com 644, os espaços em branco após a palavra começar ou a linha que começa com MITE?

Em seguida, quando o arquivo é lido em python faz qualquer coisa para o código binário que tem que ser desfeita quando é lido de volta para fora?

posso encontrar as linhas onde os gráficos começar:

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

Eu posso facilmente usar o mesmo processo para obter a palavra começar, ou para identificar o nome do arquivo e chegar ao final do nome do arquivo na linha de 'primeira'. Eu também tenho successefully chegado ao final do arquivo gif incorporado. Mas eu não consigo escrever a combinação correta das coisas, então quando eu duplo clique sobre h65803h6580301.gif quando foi isolado e guardado eu chegar para ver o gráfico.

Curiosamente, quando eu abrir o arquivo em rb, os fins de linha parecem ainda estar presentes, embora eles não parecem ter qualquer efeito na notebpad. Assim que é claramente um dos meus problemas eu poderia precisar para readlines e juntar-se as linhas juntos depois que eliminasse o \ n

Eu amo este site e eu adoro Python

Isso era muito fácil, uma vez que eu li o post de bendin. Eu apenas tive que cortar a seção que começou com a palavra começar e salvar que em um arquivo txt e, em seguida, execute o seguinte comando:

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

Eu tenho que trabalhar com algumas outras coisas para o resto do dia, mas vou postar mais aqui, como eu olhar para isso mais de perto. A primeira coisa que precisamos descobrir é como usar algo diferente de um arquivo, que é desde que eu ler o arquivo .txt inteira na memória e cortada para fora a seção que tem a necessidade imagem que eu a trabalhar com a secção cortada em vez de escrevê-lo para test2.txt. Estou certo de que pode ser feito é apenas para descobrir como fazê-lo.

Foi útil?

Solução

O que você está olhando não é "binário", é uuencoded . biblioteca padrão do Python inclui o módulo uu , para manipular dados uuencoded.

O módulo uu requer o uso de arquivos temporários para a codificação e decodificação. Você pode fazer isso sem recorrer a arquivos temporários usando o Python codecs módulo como este:

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

Outras dicas

Você definitivamente precisa estar lendo em modo binário se o conteúdo inclui imagens JPEG.

Assim, Python inclui um analisador SGML, http://docs.python.org/ biblioteca / sgmllib.html .

Não há exemplo lá, mas tudo o que você precisa fazer é métodos do_ de configuração para lidar com as tags SGML que deseja.

Você precisa open(filename,'rb') para abrir o arquivo em modo binário. Esteja ciente de que isso fará com que python para dar Você confundindo, finais de linha de dois bytes em alguns sistemas operacionais.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top