binary string - text string unter Python 2.7

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
Resetpin
User
Beiträge: 5
Registriert: Montag 18. Juni 2012, 11:33

Hallo,

durch rumspielen mit der file IO wollte ich mal eine Datei im binary Modus auslesen um zu sehen wie sich das zum textmodus unterscheidet.
Leider hab ich keinen unterschied feststellen können.

folgendes habe ich probiert:

Code: Alles auswählen

dateiname = "exefile.exe"
file = open(dateiname, "rb")
inhalt = file.read(10)
print inhalt
Erwarten würde ich als Ergebnis des print Befehls eine Zahl von 0 bis 255 aber es wird mir ein Buchstabe angezeigt
der eben diesem Bytewert entspricht. Das identische Ergebnis erhalte ich beim Aufruf von file = open(dateiname, "r")
Ist die Option b eine Grundeinstellung und wenn ja wo liegt der Unterschied zwischen einem textstring und einem binary string?

Auch folgendes führt zum gleichen Ergebnis

Code: Alles auswählen

 b=b'Hallo'
 print b[0]
 H

 b='Hallo'
 print b[0]
 H

Ich hoffe mir jemand kann mir da eine Erklärung für geben.

Vielen Dank im Voraus

Frank
Zuletzt geändert von Hyperion am Dienstag 1. Juli 2014, 14:28, insgesamt 1-mal geändert.
Grund: Code in Python-Code Tags gesetzt.
BlackJack

@Resetpin: Auf Python-Seite ändert sich da gar nichts. Der `str`-Typ in Python 2.x ist ein Binärstring, also eigentlich nur eine Aneinanderreihung von Bytewerten. Und das liest und schreibt man auch aus und in Dateiobjekte, unabhängig vom Binary-Flag. Das ist für das Betriebssystem, weil da einige einen Unterschied zwischen Text und Binärdateien machen. Unter Linux wirst Du da keinen Unterschied feststellen, aber Windows verarbeitet Textdaten anders. Zum Beispiel wird beim schreiben und lesen das Zeilenendezeichen transparent geändert. Wenn Du '\n' schreibst, dann wird in die Datei im Textmodus '\r\n' geschrieben und im Binärmodus das '\n' unverändert. Beim Lesen wird im Textmodus aus den beiden Bytewerten '\r\n' dann wieder ein '\n'-Byte. Und beim Lesen im Textmodus hört die Datei bei einem '\x1a'-Bytewert auf, auch wenn danach noch Daten kommen.

Wenn man also die Daten aus `str` 1:1 schreiben und lesen will, sollte man die Datei immer im Binärmodus öffnen. Nur wenn man tatsächlich Textdateien hat, kann man auf das 'b' verzichten. Dann kann man allerdings auch überlegen `io.open()` zu verwenden und dort eine Kodierung angeben um `unicode` statt `str` zu lesen.
Antworten