Bytes aus Datei lesen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Tkreativ
User
Beiträge: 5
Registriert: Mittwoch 21. November 2012, 23:36

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?
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

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).
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.
Tkreativ
User
Beiträge: 5
Registriert: Mittwoch 21. November 2012, 23:36

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.
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.
Tkreativ
User
Beiträge: 5
Registriert: Mittwoch 21. November 2012, 23:36

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
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

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
Tkreativ
User
Beiträge: 5
Registriert: Mittwoch 21. November 2012, 23:36

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! ;)
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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?
Das Leben ist wie ein Tennisball.
Tkreativ
User
Beiträge: 5
Registriert: Mittwoch 21. November 2012, 23:36

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! ;)
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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).
Das Leben ist wie ein Tennisball.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@Tkreativ
Vielleicht könnte die hachoir library Dir künftig eine Hilfe sein?

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Antworten