Seite 1 von 1

Binary File lesen

Verfasst: Mittwoch 21. August 2019, 10:02
von Python3000
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

Re: Binary File lesen

Verfasst: Mittwoch 21. August 2019, 10:11
von __deets__
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?

Re: Binary File lesen

Verfasst: Mittwoch 21. August 2019, 11:22
von Python3000
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?

Re: Binary File lesen

Verfasst: Mittwoch 21. August 2019, 11:28
von __deets__
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.

Re: Binary File lesen

Verfasst: Mittwoch 21. August 2019, 13:07
von Sirius3
@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.

Re: Binary File lesen

Verfasst: Mittwoch 21. August 2019, 15:13
von __blackjack__
@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?

Re: Binary File lesen

Verfasst: Mittwoch 21. August 2019, 20:30
von Python3000
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?

Re: Binary File lesen

Verfasst: Mittwoch 21. August 2019, 21:34
von __blackjack__
@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?

Re: Binary File lesen

Verfasst: Mittwoch 21. August 2019, 22:23
von Python3000
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) ]

Re: Binary File lesen

Verfasst: Mittwoch 21. August 2019, 22:35
von Sirius3
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?