wheel - whl python windows




La lettura della linea soffoca su 0x1A (2)

0x1A è Ctrl-Z, e ​​storicamente lo utilizzava come marcatore di fine file. Ad esempio, prova a utilizzare un prompt dei comandi e "digita" il tuo file. Visualizzerà il contenuto solo su Ctrl-Z.

Python usa la funzione CRT di Windows _wfopen, che implementa la semantica "Ctrl-Z is EOF".

Ho il seguente file:

abcde
kwakwa
<0x1A>
line3
linllll

Dove <0x1A> rappresenta un byte con il valore esadecimale di 0x1A. Durante il tentativo 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 modalità binaria (o newline universale) - 'rb' o 'rU'. Puoi spiegare questo comportamento?


Ned è ovviamente corretto.

Se la tua curiosità è un po 'più profonda, la causa principale è la retrocompatibilità portata all'estremo. Windows è compatibile con DOS, che utilizza Ctrl-Z come marker opzionale 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 teneva traccia delle dimensioni dei file fino al livello dei byte, ma teneva traccia solo del numero di settori del disco floppy. Se il tuo file non era un multiplo esatto di 128 byte, ti serviva 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ù vecchia usata da DEC.





binary-data