Wie trennen Inhalt von einer Datei, die ein Behälter für binäre und andere Formen von Inhalten ist

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

Frage

Ich versuche, einige TXT-Dateien zu analysieren. Diese Dateien dienen als Behälter für eine variable Anzahl von ‚Kindern‘ Dateien, die festgelegt sind ausgeschaltet oder identifiziert innerhalb des Behälters mit SGML-Tags. Mit Python kann ich trennen einfach die Kinder-Dateien. Allerdings Probleme Ich habe der binäre Inhalt wieder heraus als eine binäre Datei (zB ein gif oder jpg) zu schreiben. Im einfachsten Fall kann der Behälter eine eingebettete HTML-Datei durch eine Grafik gefolgt, die durch den HTML-Code genannt wird. Ich gehe davon aus, dass mein Problem ist, weil ich die Original-TXT-Datei mit Open (Dateinamen, ‚r‘) lese. Aber das scheint die einzige Option, um die SGML-Tags zu finden, um die Datei zu teilen.

Ich würde jede mögliche Hilfe schätzen einige relevante Lesematerial zu identifizieren.

Ich schätze die Vorschläge, aber ich bin immer noch mit den grundlegenden Fragen zu kämpfen. Zum Beispiel, wenn ich öffnen Sie die Datei mit Wordpad und scrollen Sie zum Abschnitt als gif ich das sehen markiert:

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

kann ich umgehen den Abschnitt leicht genug zu finden, aber wo kommt die GIF-Datei beginnen. Ist der Header mit 644 beginnen, werden die Rohlinge nach dem Wort beginnen oder die Zeile, die mit MITE?

Als nächstes, wenn die Datei in Python zu lesen ist es, etwas zu dem binären Code macht, die rückgängig gemacht werden muss, wenn es wieder ausgelesen wird?

Ich kann die Linien finden, wo die Grafiken beginnen:

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

Ich kann leicht den gleichen Prozess verwenden, um das Wort zu erhalten beginnen, oder die Dateinamen zu identifizieren und in der ‚ersten‘ Zeile am Ende des Dateinamen erhalten. Ich habe successefully auch bis zum Ende der eingebetteten GIF-Datei bekommen. Aber ich kann nicht scheinen, um die richtige Kombination der Dinge so zu schreiben, wenn ich auf h65803h6580301.gif verdoppeln, wenn es isoliert wurde und gespeichert ich die Grafik zu sehen.

Interessant ist, wenn ich die Datei in rb öffnen, erscheinen die Zeilenende vorhanden, auch noch sein, obwohl sie scheinen keine Wirkung in notebpad zu haben. Das ist also eindeutig ein meine Probleme, die ich könnte zu Leseleitungen muß und die Linien zusammen nach dem Strippen, um den \ n beitreten

Ich liebe diesen Ort, und ich liebe PYTHON

Das war zu einfach, wenn ich bendin den Beitrag gelesen. Ich hatte gerade den Abschnitt schnippeln, die mit dem Wort begannen beginnen und das in einer txt-Datei speichern und dann den folgenden Befehl ausführen:

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

Ich habe mit einigen anderen Sachen für den Rest des Tages zu arbeiten, aber ich werde mehr werden hier als ich auf diesem genauer ansehen. Das erste, was ich entdecken müssen, ist, wie andere etwas zu verwenden, als eine Datei, das heißt, da ich die ganze TXT-Datei in den Speicher geladen und den Abschnitt herausgeschnitten, die das Bild habe ich mit dem gekappten Abschnitt arbeiten müssen, anstatt sie zu schreiben out zu test2.txt. Ich bin sicher, dass getan werden kann, es ist einfach, herauszufinden, wie es zu tun.

War es hilfreich?

Lösung

Was Sie sehen, ist nicht "binary", es ist uuencoded . Python-Standardbibliothek enthält das Modul uu , uuencoded Daten zu verarbeiten.

Das Modul uu erfordert die Verwendung von temporären Dateien für die Codierung und Decodieren. Sie können dies erreichen, ohne die durch die Verwendung Python temporäre Dateien zurückgreifen Codecs Modul wie folgt:

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

Andere Tipps

Sie müssen auf jeden Fall im Binär-Modus zu lesen, wenn der Inhalt JPEG-Bilder enthält.

Wie gut, Python enthält einen SGML-Parser, http://docs.python.org/ Bibliothek / sgmllib.html .

Es gibt kein Beispiel gibt, aber alles, was Sie tun müssen, ist Setup do_ Methoden, um die SGML-Tags zu handhaben Sie es wünschen.

Sie müssen open(filename,'rb') die Datei in Binär-Modus zu öffnen. Seien Sie sich bewusst, dass dies dazu führen, Python Ihnen verwirrend, Zwei-Byte-Zeilenende auf einigen Betriebssystemen zu geben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top