Cómo separar el contenido de un archivo que es un contenedor para contenido binario y otras formas de contenido

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

Pregunta

Estoy intentando analizar algunos archivos .txt. Estos archivos sirven como contenedores para un número variable de archivos 'secundarios' que se activan o identifican dentro del contenedor con etiquetas SGML. Con Python puedo separar fácilmente los archivos de los niños. Sin embargo, estoy teniendo problemas para volver a escribir el contenido binario como un archivo binario (por ejemplo, un gif o jpg). En el caso más simple, el contenedor podría tener un archivo html incrustado seguido de un gráfico llamado por el html. Supongo que mi problema es porque estoy leyendo el archivo .txt original usando abrir (nombre de archivo, 'r'). Pero esa parece ser la única opción para encontrar las etiquetas de sgml para dividir el archivo.

Agradecería cualquier ayuda para identificar algún material de lectura relevante.

Aprecio las sugerencias, pero todavía estoy luchando con las preguntas más básicas. Por ejemplo, cuando abro el archivo con wordpad y me desplazo hacia la sección etiquetada como un gif, veo esto:

<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
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())
"PL"`@('!P<)"0D#`P,%!04#\_/^_O[Y^?GZ^OK]_?WX^/C\_/SV]O;U]?

Puedo manejar la búsqueda de la sección con bastante facilidad, pero dónde comienza el archivo gif. ¿El encabezado comienza con 644, los espacios en blanco después del comienzo de la palabra o la línea que comienza con MITE?

A continuación, cuando el archivo se lee en python, ¿hace algo con el código binario que debe deshacerse cuando se vuelve a leer?

Puedo encontrar las líneas donde comienzan los gráficos:

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

Puedo usar fácilmente el mismo proceso para hacer que comience la palabra, o para identificar el nombre de archivo y llegar al final del nombre de archivo en la primera línea. También he llegado con éxito al final del archivo gif incrustado. Pero parece que no puedo escribir la combinación correcta de cosas, así que cuando hago doble clic en h65803h6580301.gif cuando se ha aislado y guardado, puedo ver el gráfico.

Curiosamente, cuando abro el archivo en rb, los finales de línea parecen estar todavía presentes aunque no parecen tener ningún efecto en el bloc de notas. Así que ese es claramente uno de mis problemas que podría necesitar para leer líneas y unir las líneas después de eliminar el \ n

Me encanta este sitio y me encanta PYTHON

Esto fue demasiado fácil una vez que leí la publicación de bendin. Solo tuve que cortar la sección que comenzó con la palabra comenzar y guardarla en un archivo txt y luego ejecutar el siguiente comando:

<*>

Tengo que trabajar con otras cosas por el resto del día, pero publicaré más aquí cuando lo vea más de cerca. Lo primero que debo descubrir es cómo usar algo que no sea un archivo, es decir, ya que leí todo el archivo .txt en la memoria y recorté la sección que contiene la imagen que necesito para trabajar con la sección recortada en lugar de escribirla. a prueba2.txt. Estoy seguro de que se puede hacer, es solo averiguar cómo hacerlo.

¿Fue útil?

Solución

Lo que estás viendo no es " binario " ;, uuencoded . La biblioteca estándar de Python incluye el módulo uu , para manejar los datos uuencoded.

El módulo uu requiere el uso de archivos temporales para la codificación y la decodificación. Puede lograr esto sin tener que recurrir a archivos temporales utilizando el módulo códecs de Python 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()

Otros consejos

Definitivamente, debes estar leyendo en modo binario si el contenido incluye imágenes JPEG.

Además, Python incluye un analizador SGML, http://docs.python.org/ library / sgmllib.html .

No hay ningún ejemplo allí, pero todo lo que necesita hacer es configurar los métodos do_ para manejar las etiquetas de sgml que desee.

Necesita abrir (nombre de archivo, 'rb') para abrir el archivo en modo binario. Tenga en cuenta que esto hará que Python le dé terminaciones de línea confusas de dos bytes en algunos sistemas operativos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top