2009-01-01 23 views
13

tengo el siguiente archivo:lectura Línea ahoga en 0x1A

abcde 
kwakwa 
<0x1A> 
line3 
linllll 

Dónde <0x1A> representa un byte con el valor hexadecimal de 0x1A. Al intentar leer este archivo en Python como:

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

Sólo lee las dos primeras líneas, y sale del bucle.

La solución parece ser abrir el archivo en modo binario (o modo de nueva línea universal) - 'rb' o 'rU'. ¿Puedes explicar este comportamiento?

+0

Cómo sabe que el byte representa <0x1A>. Para mí, simplemente dice 'SUB' en Notepadd ++ – Programmer

+0

. Otra solución es usar Python 3 o ['io.open()'] (https://docs.python.org/2/library/io.html # io.open) en Python 2; los objetos del archivo 'io' siempre usan el archivo en modo binario en lo que respecta al sistema operativo y, por lo tanto, Windows no 'terminará' el archivo prematuramente. –

Respuesta

28

0x1A es Ctrl-Z, y DOS lo usó históricamente como marcador de fin de archivo. Por ejemplo, intente utilizar un símbolo del sistema y "escriba" su archivo. Solo mostrará el contenido en la Ctrl-Z.

Python usa la función CRT de Windows _wfopen, que implementa la semántica "Ctrl-Z es EOF".

+0

¡Si no hubiera verificado mis datos, podría haber sido el primero! ¡Sacudo el puño con furia indefensa! –

+0

En Linux, sin embargo, funciona bien. –

+0

Me recuerda que una vez tuve que crear un documento PostScript con LaTeX que incluía imágenes PostScript creadas en Windows. Me pregunté por qué la impresora dejó de imprimir después de la primera foto ... Bueno, el último byte en los archivos de imagen PostScript era 0x1A. –

9

Ned es, por supuesto, correcto.

Si su curiosidad es un poco más profunda, la causa raíz es la compatibilidad con versiones anteriores llevada al extremo. Windows es compatible con DOS, que usó Ctrl-Z como marcador opcional de fin de archivo para archivos de texto. Lo que quizás no sepa es que DOS era compatible con CP/M, que era popular en las computadoras pequeñas antes de la PC. El sistema de archivos de CP/M no realizaba un seguimiento de los tamaños de los archivos hasta el nivel de bytes, solo realizaba un seguimiento por el número de sectores de disquetes. Si su archivo no era un múltiplo exacto de 128 bytes, necesitaba una forma de marcar el final del texto. This Wikipedia article implica que la selección de Ctrl-Z se basó en una convención aún más antigua utilizada por DEC.

Cuestiones relacionadas