web-dev-qa-db-fra.com

Itération sur un fichier avec Python

J'ai un problème pour comprendre itérer sur un fichier, je vais sur ce que je tape sur l'interprète et le résultat:

>>> f = open('baby1990.html', 'rU')
>>> for line in f.readlines():
>>>  print(line)

>>> ...
>>> ... all the lines from the file appear here
>>> ...

Quand j'essaye encore de réitérer le même fichier ouvert, je n'ai rien eu !!!

>>> f = open('baby1990.html', 'rU')
>>> for line in f.readlines():
>>>    print(line)
>>>
>>>

Il n'y a pas de sortie du tout, pour résoudre ceci, je dois fermer () le fichier puis l'ouvrir à nouveau pour le lire !! Est-ce un comportement normal?

49
MYZ

Oui, c'est un comportement normal. En gros, vous lisez pour la première fois la fin du fichier (vous pouvez l’imaginer en train de lire une cassette), vous ne pouvez donc plus en lire une autre copie à moins que vous ne le réinitialisiez, soit en utilisant f.seek(0) repositionner au début du fichier ou bien le fermer puis l'ouvrir à nouveau, ce qui commencera au début du fichier.

Si vous préférez, vous pouvez utiliser la syntaxe with, qui fermera automatiquement le fichier pour vous.

par exemple.,

with open('baby1990.html', 'rU') as f:
  for line in f:
     print line

une fois l'exécution de ce bloc terminée, le fichier est automatiquement fermé pour vous. Vous pouvez donc exécuter ce bloc à plusieurs reprises sans fermer explicitement le fichier vous-même et le lire à nouveau.

77
Levon

Lorsque l'objet fichier lit le fichier, il utilise un pointeur pour garder une trace de l'endroit où il se trouve. Si vous lisez une partie du fichier puis y revenez plus tard, il reprendra là où vous l'avez laissé. Si vous lisez l'intégralité du fichier et revenez au même objet file, ce sera comme si vous lisiez un fichier vide car le pointeur se trouve à la fin du fichier et qu'il ne reste plus rien à lire. Vous pouvez utiliser file.tell() pour voir où se trouve le pointeur dans le fichier et file.seek Pour définir le pointeur. Par exemple:

>>> file = open('myfile.txt')
>>> file.tell()
0
>>> file.readline()
'one\n'
>>> file.tell()
4L
>>> file.readline()
'2\n'
>>> file.tell()
6L
>>> file.seek(4)
>>> file.readline()
'2\n'

En outre, vous devez savoir que file.readlines() lit l'intégralité du fichier et le stocke sous forme de liste. C'est utile à savoir car vous pouvez remplacer:

for line in file.readlines():
    #do stuff
file.seek(0)
for line in file.readlines():
    #do more stuff

avec:

lines = file.readlines()
for each_line in lines:
    #do stuff
for each_line in lines:
    #do more stuff

Vous pouvez également parcourir un fichier, ligne par ligne, sans conserver l'intégralité du fichier en mémoire (cela peut être très utile pour des fichiers très volumineux) en procédant comme suit:

for line in file:
    #do stuff
15
Bi Rico

L'objet fichier est un tampon. Lorsque vous lisez dans la mémoire tampon, la partie que vous lisez est utilisée (la position de lecture est décalée). Lorsque vous parcourez l'intégralité du fichier, la position de lecture se trouve à la fin du fichier, elle ne renvoie rien car il ne reste plus rien à lire.

Si, pour une raison quelconque, vous devez réinitialiser la position de lecture sur un objet de fichier, vous pouvez effectuer les opérations suivantes:

f.seek(0)
8
Joel Cornett

Bien sûr. C'est un comportement normal et sain. Au lieu de fermer et de rouvrir, vous pourriez rewind le fichier.

1
ch3ka