Frage

Ich habe die folgende Datei:

abcde
kwakwa
<0x1A>
line3
linllll

Wo <0x1A> repräsentiert ein Byte mit dem Hex-Wert von 0x1A. 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 verlässt die Schleife.

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

War es hilfreich?

Lösung

0x1A ist Strg-Z, und DOS historisch verwendet, dass als End-of-File-Marker. Zum Beispiel versuchen, eine Eingabeaufforderung, und „Typen“ ing Ihrer Datei. Es wird nur den Inhalt an die Strg-Z auf.

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

Andere Tipps

Ned ist natürlich richtig.

Wenn Sie Ihre Neugier ein wenig tiefer läuft, ist die Ursache der Abwärtskompatibilität zu einem extremen genommen. Windows ist kompatibel mit DOS, die verwendeten Strg-Z als optionales Dateiende Markierung für Textdateien. Was Sie vielleicht nicht wissen ist, dass DOS mit CP / M kompatibel war, die auf kleinen Computern vor dem PC populär war. CP / M Dateisystem nicht den Überblick über Dateigrößen bis auf Byte-Ebene halten hat, es hielt nur Spur durch die Anzahl der Floppy-Disk Sektoren. Wenn die Datei nicht genau ein Vielfaches von 128 Byte war, benötigt man eine Möglichkeit, das Ende des Textes zu markieren. Diese Wikipedia-Artikel setzt voraus, dass die Auswahl der Strg-Z wurde auf einer noch älteren Konvention basiert, die von Dezember

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top