Seite 1 von 1

Bytes aus Datei lesen

Verfasst: Mittwoch 21. November 2012, 23:44
von Tkreativ
Moin,

ich weiß ihr habt sicher bessere zutun als vermutlich so "triviale" Fragen zu beantworten aber vielleicht könnt ihr mir trotzdem helfen. Ich finde die Lösung einfach nicht.
Problem ist folgendes:

Wenn ich eine Bytesequenz beispielsweise "\x1f\x8b" in eine Variable speicher also

a = "\x1f\x8b"
print a

bekomme ich:
▼ï

raus. (genau das was ich brauche).
Allerdings wenn ich die Bytesequenz aus einer Datei lese (angenommen in testfile.txt steht "\x1f\x8b" ohne ")

w = open("testfile.txt", "r")
a = w.read()
w.close()
print a

bekomme ich:
\x1f\x8b

----
Wie bekomme ich auch aus dem testfile.txt den korrekten Variablenwert
▼ï
?!

ich habs schon mit
str(a)
bytearray(a)
etc. versucht aber irgendwie bekomme ich nicht den dreh raus.

Jemand ne Idee?

Re: Bytes aus Datei lesen

Verfasst: Mittwoch 21. November 2012, 23:57
von webspider
Inhalt und Darstellung sind zwei verschiedene Paar Schuhe. Lies dich mal in gängige Encodings ein (und wie sich Python 2 und 3 bei dessen Verarbeitung unterscheiden um zukünftigen Missverständnissen vorzubeugen).

Re: Bytes aus Datei lesen

Verfasst: Donnerstag 22. November 2012, 08:47
von BlackJack
@Tkreativ: Wie kommt denn '\x1f\x8b' überhaupt in die Datei? Wäre es nicht besser dort tatsächlich die beiden Bytes statt dieser 8 Bytes zu speichern die in *Python-Quelltext* und dort auch nur in einer *literalen Zeichenkette* diese zwei Bytes *repräsentieren*?

Falls Du nach einer Möglichkeit suchst beliebige Bytewerte in einer Textdatei in einem für Menschen lesbaren (naja) Format zu speichern, solltest Du etwas nehmen was allgemeiner verbreitet ist, als ausgerechnet die Form wie man das in Python-Zeichenketten kodieren kann. Zum Beispiel in einer der Formen zwischen denen das `binascii`-Modul in der Standardbibliothek zwischen ASCII-Darstellung und Binärdaten umwandeln kann. Also im einfachsten Fall einfach als Hexadezimaldarstellung mit den vier Zeichen ``1f8b``. Die Buchstaben können auch gross geschrieben werden.

Re: Bytes aus Datei lesen

Verfasst: Donnerstag 22. November 2012, 09:43
von Tkreativ
Danke schon mal für die schnellen Antworten.

@webspider Ich hab mir schon überlegt ob es an dem Encoding in UTF-8 oder so liegt aber danke für den Tipp ich werde mir das heute Abend nochmal genauer ansehen.

@BlackJack leider kann ich die den "Text" nicht in anderer Form abspeichern. Geht halt um folgendes. Ich bekomme aus einer Schnittstelle ein StringIO mit einem gzip File (ich werde heute Abend mal ein beispiel File posten, komme leider grade nicht dran), dass ungefähr so aussieht
\x1f\x8b\....

Wenn ich den kompletten String jetzt "händisch" mit zlib.decompress(string, 32 + MAX_WBITS) dekomprimieren lassen gibt es keine Probleme. Allerdings wenn ich es mit dem StringIO versuche = header check fehler.

Wenn ich nachher online bin stell ich mal den Beispielcode rein.

Re: Bytes aus Datei lesen

Verfasst: Donnerstag 22. November 2012, 10:27
von BlackJack
@Tkreativ: Ich glaube nicht das Du tatsächlich die Zeichenfolge \x1f\x8b… bekommst. Das wäre ziemlich kaputt. Und dann würde `zlib.decompress()` auch nicht funktionieren. Du bringst hier IMHO immer noch Darstellung und tatsächlichen Inhalt durcheinander.

Re: Bytes aus Datei lesen

Verfasst: Donnerstag 22. November 2012, 19:16
von Tkreativ
So ich hab jetzt nochmal nachgesehen

also ich bekomme folgende Zeile von der Schnittstelle:

"\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03\xb3\xc9(\xc9\xcd\xb1\xe3\xb2\xc9HML\xb1\xe3\xe2\xb4)\xc9,\xc9I\xb5\x0bI-.\xb1\xd1\x87\xb0\xb9l\xf4!\x926I\xf9)\x95@\xaa\xc0.\xc458$\xb5\xc8F\xbf\x00$\t\x15\xd5\x07\x1b\x04\x00GDd\xb7O\x00\x00\x00"

so sieht meine Funktion aus:

Code: Alles auswählen

def getDecompressFile(self, compressed):
        print sys.getdefaultencoding()
        print compressed
        print compressed.getvalue()
        print type(compressed)
        try:
            print zlib.decompress(compressed.getvalue(), 32 + zlib.MAX_WBITS)
        except Exception, e:
            print "FAILL"
            print e
Bild

wenn ich allerdings den String quasi händisch übergebe dann kann er die Datei ohne Probleme entpacken.

Also beispielsweise

Code: Alles auswählen

zlib.decompress("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03\xb3\xc9(\xc9\xcd\xb1\xe3\xb2\xc9HML\xb1\xe3\xe2\xb4)\xc9,\xc9I\xb5\x0bI-.\xb1\xd1\x87\xb0\xb9l\xf4!\x926I\xf9)\x95@\xaa\xc0.\xc458$\xb5\xc8F\xbf\x00$\t\x15\xd5\x07\x1b\x04\x00GDd\xb7O\x00\x00\x00", 32 + zlib.MAX_WBITS)
geht ohne Probleme. ist genau der selbe string den ich auch übergeben bekomme.
Komm einfach nicht weiter :(

-----

Mir würde es schon helfen, wenn mir jemand sagen könnte warum bzw. was folgender Zeichensatz ist:
x£╦H╠╔╔ ♠∟☻◄

entsteht aus

Code: Alles auswählen

rest = zlib.compress("hallo")
print rest

Re: Bytes aus Datei lesen

Verfasst: Donnerstag 22. November 2012, 19:47
von sparrow

Code: Alles auswählen

>>> import zlib
>>> rest = zlib.compress("hallo")
>>> print repr(rest)
'x\x9c\xcbH\xcc\xc9\xc9\x07\x00\x06\x1c\x02\x11'
>>> print zlib.decompress(rest)
hallo

Re: Bytes aus Datei lesen

Verfasst: Donnerstag 22. November 2012, 20:23
von Tkreativ
sparrow hat geschrieben:

Code: Alles auswählen

>>> import zlib
>>> rest = zlib.compress("hallo")
>>> print repr(rest)
'x\x9c\xcbH\xcc\xc9\xc9\x07\x00\x06\x1c\x02\x11'
>>> print zlib.decompress(rest)
hallo
Danke. Dein Tipp hat mich auf die richtige Fährte gebracht.
Ich kannte die Funktion repr() nicht und die hat mir gezeigt, dass meine Schnittstelle mir ein String übergibt der quasi so aussieht:

\\x1f\\x8b....

ich brauch aber ja
\x1f\x8b

jetzt hab ich danach gesucht und die Lösung ist, ich muss mein String vorher mit "string_escape" decoden.

Merci und Thread kann zu! ;)

Re: Bytes aus Datei lesen

Verfasst: Donnerstag 22. November 2012, 20:44
von EyDu
Das sieht für mich danach aus, als wenn jemand da tatsächlich beim Speichern Mist gebaut hat. Zum einen wäre das Format total sinnlos und zum anderen braucht es viermal so viel Speicherplatz wie es sollte. Wie sieht den der Inhalt der komprimierten Datei aus, wenn du sie mit einem ganz normalen Editor öffnest?

Re: Bytes aus Datei lesen

Verfasst: Donnerstag 22. November 2012, 22:52
von Tkreativ
ohne das escapen kann ich die Dateien halt nicht öffnen weil es ein header error gibt aber wenn ich es escape dann ist es ein ganz normales gzip file.

funktioniert aber jetzt. alles super! ;)

Re: Bytes aus Datei lesen

Verfasst: Freitag 23. November 2012, 00:17
von EyDu
Du verstehst das Problem glaube ich nicht: natürlich kannst du die Dateien jetzt öffnen, das ändert aber nichts daran, dass in der Datei noch Unsinn drinsteht. Du solltest also eher das Speichern der Dateien richtig machen (falls du dazu die Möglichkeit hast).

Re: Bytes aus Datei lesen

Verfasst: Samstag 24. November 2012, 19:10
von mutetella
@Tkreativ
Vielleicht könnte die hachoir library Dir künftig eine Hilfe sein?

mutetella