Ich habe folgenden Codeschnipsle aus einem Python 2.7 Script.
inputFile = open(inputFileName,'rb')
fileHeader = inputFile.read(1060)
addressCounter = addressCounter + 1060
print fileHeader[0:3]
Ausgabe: ABC
Wenn ich dieses Script in Python3.x starte ...
inputFile = open(inputFileName,'rb')
fileHeader = inputFile.read(1060)
addressCounter = addressCounter + 1060
print (fileHeader[0:3])
kommt:
Ausgabe: b 'ABC'
Ich hätte aber gerne ABC.
Was macht hier Python3.x anders als Python2.x
Binary File lesen
Wenn es ein binary file ist, dann macht Python3 das richtige. Seit Version 3 ist Python strikter in der Unterscheidung zwischen binaeren Daten und Strings. Daher bekommst du eine bytes-Object (erkennbar an dem fuehrenden b).
Warum stoert dich das?
Warum stoert dich das?
-
- User
- Beiträge: 4
- Registriert: Mittwoch 21. August 2019, 09:47
Weil ich den fileheader nachher auswerten möchte und da kann ich das b und die beiden ' ' nicht gebrauchen.
Hast Du eine Idee wie ich eine Ausgabe bzw. fileheader = ABC statt b 'ABC' bekomme?
Hast Du eine Idee wie ich eine Ausgabe bzw. fileheader = ABC statt b 'ABC' bekomme?
Wenn du das encoding kennst, in dem die Daten vorliegen, dann musst du fuer eine vernuenftige Ausgabe vor der Ausgabe mit print entsprechend dekodieren. Also zB
Das auf den *gesamten* Daten zu machen ist natuerlich auch moeglich (indem du das 'b' beim open weglaesst), aber da du binaer-Daten hast, kommt sich das aller Wahrscheinlichkeit in die Quere.
Alternativ kannst du natuerlich auch per sys.stdout.buffer.write binaere Daten schreiben, aber ggf. mit ueblen Konsequenzen wenn da das binaere und das Terminal-Encoding nicht uebereinstimmen.
Code: Alles auswählen
wert.decode('ascii')
Alternativ kannst du natuerlich auch per sys.stdout.buffer.write binaere Daten schreiben, aber ggf. mit ueblen Konsequenzen wenn da das binaere und das Terminal-Encoding nicht uebereinstimmen.
@Python3000: das b' ist nur die Darstellung der Bytes, wenn Du damit in Python weiterarbeitest, dann sind das nur drei Bytes, mehr nicht. Bis auf ein paar weitere kleinere Unterschiede zwischen Python2 und Python3 sollte die Weiterverarbeitung ohne weiteres funktionieren.
- __blackjack__
- User
- Beiträge: 14047
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@Python3000: `addressCounter` sieht falsch aus. Das stimmt ja nur wenn auch tatsächlich 1060 Bytes vom `read()` geliefert wurden. Zudem haben Dateiobjekte ja eine `tell()`-Methode – also warum überhaupt diese Information selbst noch einmal ausserhalb des Dateiobjekts berechnen?
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
-
- User
- Beiträge: 4
- Registriert: Mittwoch 21. August 2019, 09:47
Ich werde mal die verschiedenen Lösungsansätze testen.
.... Zudem haben Dateiobjekte ja eine `tell()`-Methode ... hab ich nicht verstanden.
Zum Verständnis ein kleines Beispiel vielleicht?
.... Zudem haben Dateiobjekte ja eine `tell()`-Methode ... hab ich nicht verstanden.
Zum Verständnis ein kleines Beispiel vielleicht?
- __blackjack__
- User
- Beiträge: 14047
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@Python3000: Zum Verständnis die Dokumentation von `IOBase.tell()` lesen und darüber nachdenken wie sich das vom Wert von `addressCount` unterscheidet. Was machst Du damit überhaupt?
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
-
- User
- Beiträge: 4
- Registriert: Mittwoch 21. August 2019, 09:47
Ich filtere Daten aus einem Binärfile. Dazu muss ich die Daten parsen und anschließend verarbeiten. Das es Binär Daten sind weis ich.
Deshalb leuchtet mich auch nicht ein warum Python3 vor jedem eingelesenen Datenblock ein b' ' setzt.
Ich versuche eigentlich nur ein bestehendes Script unter Python3 zum laufen zu bringen. Dachte nicht das es so kompliziert wird.
[ Info an blackjack ... ich lese nicht gern ;0) ]
Deshalb leuchtet mich auch nicht ein warum Python3 vor jedem eingelesenen Datenblock ein b' ' setzt.
Ich versuche eigentlich nur ein bestehendes Script unter Python3 zum laufen zu bringen. Dachte nicht das es so kompliziert wird.
[ Info an blackjack ... ich lese nicht gern ;0) ]