Pergunta

Eu tenho o seguinte arquivo:

abcde
kwakwa
<0x1A>
line3
linllll

Onde <0x1A> representa um byte com o valor hexadecimal de 0x1A. Ao tentar ler este arquivo em Python como:

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

Ele só lê as duas primeiras linhas, e sai do loop.

A solução parece ser a de abrir o arquivo no (modo de nova linha ou universal) binário - 'rb' ou 'rU'. Você pode explicar esse comportamento?

Foi útil?

Solução

0x1A é Ctrl-Z, e ??DOS utilizado historicamente que como um marcador de fim-de-lima. Por exemplo, tente usar um prompt de comando e "tipo" ing seu arquivo. Ele só irá mostrar o conteúdo até o Ctrl-Z.

Python usa a função _wfopen o Windows CRT, que implementa o "Ctrl-Z é EOF" semântica.

Outras dicas

Ned é, naturalmente, correta.

Se a sua curiosidade corre um pouco mais profundo, a causa principal é a compatibilidade com versões anteriores levada ao extremo. Windows é compatível com o DOS, que usou Ctrl-Z como um fim opcional de marcador de arquivo para arquivos de texto. O que você talvez não saiba é que o DOS era compatível com o CP / M, que era popular em pequenos computadores antes do PC. CP / sistema de arquivos do M não manter o controle de tamanhos de arquivo até o nível de byte, ele só acompanhou pelo número de setores de disquetes. Se o arquivo não era um múltiplo exato de 128 bytes, você precisava de uma maneira para marcar o fim do texto. Este artigo Wikipedia implica que a selecção de Ctrl-Z foi baseado em uma convenção ainda mais antiga usada por dezembro

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top