2016-04-27 19 views
0

Ich öffne meine Datei wie folgt:Neuzeilenzeichen in Binärdatei mit Python ignorieren?

f = open("filename.ext", "rb") # ensure binary reading with b 

Meine erste Zeile von Daten sieht wie folgt aus (wenn f.readline() verwenden):

'\x04\x00\x00\x00\x12\x00\x00\x00\x04\x00\x00\x00\xb4\x00\x00\x00\x01\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x05\x00\x00\x00\x06\x00\x00\x00:\x00\x00\x00;\x00\x00\x00<\x00\x00\x007\x00\x00\x008\x00\x00\x009\x00\x00\x00\x07\x00\x00\x00\x08\x00\x00\x00\t\x00\x00\x00\n' 

Das Ding ist, ich will für Byte dieses Datenbytes lesen (f.read(4)). Während des Debuggens erkannte ich, dass, wenn es bis zum Ende der ersten Zeile kommt, es immer noch in der Newline-Zeichen \n übernimmt und es als das erste Byte der folgenden int ich gelesen verwendet wird. Ich möchte nicht einfach .splitlines() verwenden, weil einige Daten eine n innerhalb haben können und ich will es nicht beschädigen. Ich benutze übrigens Python 2.7.10. Ich lese auch, dass das Öffnen einer Binärdatei mit dem Parameter b "kümmert sich" der neuen Zeile/Ende der Zeile Zeichen; Warum ist das bei mir nicht der Fall?

Dies ist, was in der Konsole geschieht als die Position unmittelbar vor dem Newline-Zeichen ist die Datei:

>>> d = f.read(4) 
>>> d 
'\n\x00\x00\x00' 
>>> s = struct.unpack("i", d) 
>>> s 
(10,) 
+0

Was ist das Format der Datei wirklich? Sind die Zeilenumbrüche gedacht? Ist das Newline-Zeichen nur ein Zufall, wenn die wahre Information Bytes sind? Was ist das Problem beim Lesen? –

+0

Nun, wie jede Datei, gibt es Zeilenumbrüche am Ende der Zeile. Jede Zeile hat eine ganze Zahl von Zahlen, aber das Lesen von Gruppen von 4 Bytes hat irrende Folgen, weil die Position der Datei am Ende der ersten Zeile, kurz vor '\ n', dem nächsten' f.read (4) 'steht nimmt '\ n' als das erste Byte und die nächsten drei Bytes sind die ersten drei Bytes der zweiten Zeile (die nächste Zeile). – user3180077

+0

Also im Grunde sind die newlines für die Formatierung/Trennung und sollte nicht als "Daten" gelesen werden? –

Antwort

1

(Gefolgt von Diskussion mit OP im Chat)

Scheint, wie die Datei im Binärformat ist und die Zeilenumbrüche sind nur Fehl- interpretierte Werte. Dies kann passieren, wenn Sie zB 10 in die Datei schreiben.

Dies bedeutet nicht, dass newline beabsichtigt war, und es ist wahrscheinlich nicht. Sie können einfach ignorieren, dass es als \n gedruckt wird und es einfach als Daten verwenden.

0

Sie sollten es sich um ein Newline nur in der Lage sein, um das Bytes zu ersetzen, die angeben, ist.

>>> d = f.read(4).replace(b'\x0d\x0a', b'') #\r\n should be bytes b'\x0d\x0a' 
>>> diff = 4 - len(d) 
>>> while diff > 0: # You can probably make this more sophisticated 
...  d += f.read(diff).replace(b'\x0d\x0a', b'') #\r\n should be bytes b'\x0d\x0a' 
...  diff = 4 - len(d) 
>>> 
>>> s = struct.unpack("i", d) 

Dies sollte Ihnen eine Vorstellung davon geben, wie es funktioniert. Dieser Ansatz könnte mit der Byteausrichtung Ihrer Daten verwechselt werden.

Wenn Sie wirklich sehen "\n" in Ihrem Druck von d dann versuchen .replace(b"\n", b"")