2009-01-01 7 views
13

Je le fichier suivant:lecture sur la ligne selfs 0x1A

abcde 
kwakwa 
<0x1A> 
line3 
linllll 

<0x1A> représente un octet avec la valeur hexadécimale de 0x1A. Lorsque vous essayez de lire ce fichier en Python comme:

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

Il ne lit que les deux premières lignes, et sort de la boucle.

La solution semble être d'ouvrir le fichier en binaire (ou en mode newline universel) - 'rb' ou 'rU'. Pouvez-vous expliquer ce comportement?

+0

Comment savez-vous que l'octet représenté <0x1A>. Pour moi, il suffit de dire 'SUB' dans notepadd ++ – Programmer

+0

Une autre solution consiste à utiliser Python 3 ou ['io.open()'] (https://docs.python.org/2/library/io.html # io.open) dans Python 2; les objets du fichier 'io' utilisent toujours le fichier en mode binaire en ce qui concerne le système d'exploitation et donc Windows ne« terminera »pas le fichier prématurément. –

Répondre

28

0x1A est Ctrl-Z, et DOS utilisé historiquement comme marqueur de fin de fichier. Par exemple, essayez d'utiliser une invite de commande et "tapez" votre fichier. Il n'affichera que le contenu du Ctrl-Z.

Python utilise la fonction Windows CRT _wfopen, qui implémente la sémantique "Ctrl-Z is EOF".

+0

Si je n'avais pas vérifié mes faits, j'aurais pu être le premier! Je serre mon poing dans une furie impuissante! –

+0

Sous Linux, cependant, cela fonctionne très bien. –

+0

Me rappelle que j'ai dû construire un document PostScript avec LaTeX qui comprenait des images PostScript créées sous Windows. Je me demandais pourquoi l'imprimante a cessé d'imprimer après la première image ... Eh bien, le dernier octet dans les fichiers d'image PostScript était 0x1A. –

9

Ned est bien sûr correct.

Si votre curiosité est un peu plus profonde, la cause première est la rétrocompatibilité poussée à l'extrême. Windows est compatible avec DOS, qui utilisait Ctrl-Z comme marqueur de fin de fichier facultatif pour les fichiers texte. Ce que vous ne savez peut-être pas, c'est que DOS était compatible avec CP/M, qui était populaire sur les petits ordinateurs avant le PC. Le système de fichiers de CP/M n'a pas gardé la trace de la taille des fichiers jusqu'au niveau de l'octet, il n'a fait que suivre le nombre de secteurs de disquettes. Si votre fichier n'était pas un multiple exact de 128 octets, vous aviez besoin d'un moyen de marquer la fin du texte. This Wikipedia article implique que la sélection de Ctrl-Z était basée sur une convention encore plus ancienne utilisée par DEC.

Questions connexes