Question

J'essaie d'analyser certains fichiers .txt. Ces fichiers servent de conteneurs pour un nombre variable de fichiers «enfants» qui sont définis ou identifiés dans le conteneur avec des balises SGML. Avec python, je peux facilement séparer les fichiers enfants. Cependant, j'ai du mal à réécrire le contenu binaire sous forme de fichier binaire (par exemple, un gif ou un jpg). Dans le cas le plus simple, le conteneur peut comporter un fichier HTML intégré suivi d'un graphique appelé par le code HTML. Je suppose que mon problème vient du fait que je lis le fichier .txt original en utilisant open (nomfichier, 'r'). Mais cela semble être la seule option pour trouver les balises SGML permettant de scinder le fichier.

J'apprécierais toute aide pour identifier du matériel de lecture pertinent.

J'apprécie les suggestions, mais je suis toujours aux prises avec les questions les plus fondamentales. Par exemple, lorsque j'ouvre le fichier avec WordPad et que je fais défiler l'écran jusqu'à la section étiquetée comme un gif, je vois ceci:

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

Je peux me débrouiller assez facilement pour trouver la section, mais où commence le fichier gif. L'en-tête commence-t-il par 644, les blancs après le mot ou la ligne commençant par MITE?

Ensuite, lorsque le fichier est lu dans Python, est-ce que cela modifie le code binaire qui doit être annulé lors de la lecture?

Je peux trouver les lignes où commencent les graphiques:

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

Je peux facilement utiliser le même processus pour que le mot commence ou pour identifier le nom du fichier et se rendre à la fin du nom du fichier dans la première ligne. J'ai également réussi à atteindre la fin du fichier GIF intégré. Mais je n'arrive pas à écrire la bonne combinaison de choses, donc quand je double-clique sur h65803h6580301.gif quand il a été isolé et sauvegardé, je peux voir le graphique.

Fait intéressant, lorsque j'ouvre le fichier dans rb, les fins de ligne semblent toujours être présentes, même si elles ne semblent pas avoir d'effet dans le bloc-notes. C’est donc clairement l’un de mes problèmes, j’aurai peut-être besoin de relire les lignes et de les joindre ensemble après avoir supprimé le \ n

J'aime ce site et j'aime PYTHON

C'était trop facile une fois que j'ai lu le post de Bendin. Il me suffisait de couper la section commençant par le mot begin et de l'enregistrer dans un fichier txt, puis d'exécuter la commande suivante:

<*>

Je dois travailler avec d’autres choses pour le reste de la journée, mais je vais en poster davantage ici, au fur et à mesure que j’y regarde de plus près. La première chose que je dois découvrir, c'est comment utiliser autre chose qu'un fichier, c'est-à-dire que j'ai lu tout le fichier .txt en mémoire et que j'ai tronqué la section contenant l'image dont j'ai besoin pour travailler avec la section tronquée au lieu de l'écrire. à test2.txt. Je suis sûr que cela peut être fait, c'est juste trouver comment le faire.

Était-ce utile?

La solution

Ce que vous voyez n'est pas "binaire", c'est uuencodé . La bibliothèque standard de Python inclut le module uu , qui permet de gérer les données encodées. / p>

Le module uu nécessite l'utilisation de fichiers temporaires pour le codage. et décodage. Vous pouvez y parvenir sans recourir à des fichiers temporaires en utilisant le module codecs de Python, comme suit:

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

Autres conseils

Vous devez absolument lire en mode binaire si le contenu comprend des images JPEG.

De plus, Python inclut un analyseur syntaxique SGML, http://docs.python.org/. library / sgmllib.html .

Il n'y a pas d'exemple ici, mais tout ce que vous avez à faire est d'installer des méthodes do_ pour gérer les balises sgml de votre choix.

Vous devez ouvrir (nom du fichier, 'rb') pour ouvrir le fichier en mode binaire. Sachez que cela entraînera pour Python des terminaisons de ligne confuses sur deux octets sur certains systèmes d’exploitation.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top