Pregunta

Tengo el siguiente archivo:

abcde
kwakwa
<0x1A>
line3
linllll

Donde <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,

Solo lee las dos primeras líneas y sale del bucle.

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

¿Fue útil?

Solución

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

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

Otros consejos

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 usaba Ctrl-Z como un marcador de final de archivo opcional para archivos de texto. Lo que quizás no sepa es que DOS era compatible con CP / M, que era popular en computadoras pequeñas antes que la PC. El sistema de archivos de CP / M no realizó un seguimiento de los tamaños de archivo hasta el nivel de bytes, solo realizó un seguimiento por la cantidad de sectores de disquete. Si su archivo no era un múltiplo exacto de 128 bytes, necesitaba una forma de marcar el final del texto. Este artículo de Wikipedia implica que la selección de Ctrl-Z se basó en una convención aún más antigua utilizada por DIC.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top