Question

J'ai le fichier suivant:

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 en tant que:

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

Il ne lit que les deux premières lignes et quitte la boucle.

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

Était-ce utile?

La solution

0x1A est Ctrl-Z, et DOS l’utilisait historiquement comme marqueur de fin de fichier. Par exemple, essayez d’utiliser une invite de commande et & Quot; tapez & Quot; ing. Votre fichier. Cela affichera uniquement le contenu dans Ctrl-Z.

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

Autres conseils

Ned est bien sûr correct.

Si votre curiosité est un peu plus profonde, la cause fondamentale est la compatibilité ascendante poussée à l'extrême. Windows est compatible avec DOS, qui utilisait Ctrl-Z comme marqueur facultatif de fin de fichier pour les fichiers texte. Ce que vous ignorez peut-être, 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 ne tenait pas compte de la taille des fichiers, mais uniquement du nombre de secteurs de la disquette. Si votre fichier n'était pas un multiple exact de 128 octets, vous deviez trouver un moyen de marquer la fin du texte. Cet article de Wikipedia implique que la sélection de Ctrl-Z était basée sur une convention encore plus ancienne utilisée par DEC.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top