Binary File 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
Python3000
User
Beiträge: 4
Registriert: Mittwoch 21. August 2019, 09:47

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
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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?
Python3000
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?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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

Code: Alles auswählen

wert.decode('ascii')
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.
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
Benutzeravatar
__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
Python3000
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?
Benutzeravatar
__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
Python3000
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) ]
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

Nochmal, das b ist nur für die Darstellung, damit Du weißt, dass es sich um Binärdaten handelt. Für die Verarbeitung spielt das gar keine Rolle. Also wo hast Du wirklich ein Problem?
Antworten