bobinas de leitura linha sobre 0x1A
-
03-07-2019 - |
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?
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