Domanda

Ho il seguente file:

abcde
kwakwa
<0x1A>
line3
linllll

Dove <0x1A> rappresenta un byte con il valore esadecimale di 0x1A. Quando si tenta di leggere questo file in Python come:

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

Legge solo le prime due righe ed esce dal ciclo.

La soluzione sembra essere quella di aprire il file in binario (o modalità newline universale) - 'rb' o 'rU'. Puoi spiegare questo comportamento?

È stato utile?

Soluzione

0x1A è Ctrl-Z e DOS lo utilizzava storicamente come marker di fine file. Ad esempio, prova a utilizzare un prompt dei comandi e & Quot; digita & Quot; ing il tuo file. Visualizzerà solo il contenuto su Ctrl-Z.

Python utilizza la funzione CRT di Windows _wfopen, che implementa il " Ctrl-Z è EOF " la semantica.

Altri suggerimenti

Ned è ovviamente corretto.

Se la tua curiosità è un po 'più profonda, la causa principale è la compatibilità all'indietro portata all'estremo. Windows è compatibile con DOS, che utilizzava Ctrl-Z come indicatore facoltativo di fine file per i file di testo. Quello che potresti non sapere è che DOS era compatibile con CP / M, che era popolare su piccoli computer prima del PC. Il file system di CP / M non ha tenuto traccia delle dimensioni dei file fino al livello di byte, ma ha tenuto traccia solo del numero di settori del floppy disk. Se il tuo file non era un multiplo esatto di 128 byte, avevi bisogno di un modo per contrassegnare la fine del testo. Questo articolo di Wikipedia implica che la selezione di Ctrl-Z era basata su una convenzione ancora più antica utilizzata da dicembre

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top