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?
Bytes aus Datei lesen
@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.
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.
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.
@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.
@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.
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:
wenn ich allerdings den String quasi händisch übergebe dann kann er die Datei ohne Probleme entpacken.
Also beispielsweise
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
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
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)
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
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.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
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!
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.
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.
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit )