2009-01-01 7 views
13

Ich habe die folgende Datei:Linie Lese Drosseln auf 0x1A

abcde 
kwakwa 
<0x1A> 
line3 
linllll 

Wo <0x1A> ein Byte mit dem Hex-Wert von 0x1A darstellt. Bei dem Versuch, diese Datei in Python zu lesen, wie:

for line in open('t.txt'): 
    print line, 

Es liest nur die ersten beiden Zeilen, und die Schleife beendet.

Die Lösung scheint die Datei in binären (oder Universal-Newline-Modus) zu öffnen zu sein - ‚rb‘ oder ‚rU‘. Kannst du dieses Verhalten erklären?

+0

Wie wissen Sie, dass das Byte <0x1A> vertreten. Für mich sagt es nur 'SUB' in notepadd ++ – Programmer

+0

Eine andere Problemumgehung ist die Verwendung von Python 3 oder ['io.open()'] (https://docs.python.org/2/library/io.html # io.open) in Python 2; Die 'io'-Dateiobjekte verwenden die Datei immer im binären Modus, was das Betriebssystem angeht, und Windows wird die Datei nicht vorzeitig 'beenden'. –

Antwort

28

0x1A ist Ctrl-Z und DOS verwendet historisch, dass als End-of-File-Marker. Verwenden Sie beispielsweise eine Eingabeaufforderung, und geben Sie Ihre Datei ein. Es zeigt nur den Inhalt der Strg-Z an.

Python verwendet die Windows-CRT-Funktion _wfopen, die die implementiert "Strg-Z ist EOF" Semantik.

+0

Wenn ich meine Fakten nicht überprüft hätte, hätte ich zuerst sein können! Ich schüttle hilflos meine Faust! –

+0

Unter Linux funktioniert es jedoch gut. –

+0

Erinnert mich, dass ich einmal ein PostScript-Dokument mit LaTeX erstellen musste, das PostScript-Bilder enthielt, die unter Windows erstellt wurden. Ich fragte mich, warum der Drucker nach dem ersten Bild nicht mehr drucken konnte ... Nun, das letzte Byte in den PostScript-Bilddateien war 0x1A. –

9

Ned ist natürlich richtig.

Wenn Ihre Neugier läuft ein wenig tiefer, ist die Ursache der Abwärtskompatibilität zu einem extremen genommen. Windows ist mit DOS kompatibel, wobei Strg-Z als optionales Dateiende für Textdateien verwendet wurde. Was Sie vielleicht nicht wissen ist, dass DOS mit CP/M kompatibel war, das auf kleinen Computern vor dem PC populär war. Das Dateisystem von CP/M hat die Dateigrößen nicht bis auf Byteebene verfolgt, sondern nur die Anzahl der Diskettensektoren. Wenn Ihre Datei kein exaktes Vielfaches von 128 Byte war, mussten Sie das Ende des Textes markieren. This Wikipedia article bedeutet, dass die Auswahl von Strg-Z auf einer noch älteren Konvention von DEC basierte.