4 votes

python modify mutable iterator

Le code est le suivant :

f=open('test.txt')
file=iter(f)

Quand je le fais

next(file)

Il imprimera ligne par ligne le fichier. Mais lorsque j'ai modifié le fichier test.txt et que je l'ai enregistré, la fonction next(file) a toujours imprimé le contenu du fichier original.

L'itérateur stocke-t-il le fichier complet dans la mémoire ? Si non, pourquoi le contenu du fichier n'est-il pas mis à jour ?

2voto

blhsing Points 57682

Non, en tant qu'itérateur, le file ne stocke en mémoire qu'un tampon d'anticipation, et non le fichier complet. Cela le rend efficace pour les gros fichiers.

Puisqu'il y a ce tampon d'anticipation, les changements apportés au fichier ne seront pas répercutés dans le système de gestion de l'information. next méthode. Toutefois, vous pouvez utiliser la méthode seek pour vider ce tampon afin que le prochain appel à la méthode next renverra le contenu mis à jour :

f.seek(f.tell()) # seek the current position only to clear the look-ahead buffer
print(next(f)) # prints the updated next line from the current position

1voto

Supposons ouvrir() lit 2 lettres à la fois. (La valeur réelle est io.DEFAULT_BUFFER_SIZE )

f=open('test.txt')

Vous avez créé un objet fichier, _io.TextIOWrapper ce qui, en simplifiant à l'extrême, revient à [{read from 0 to io.DEFAULT_BUFFER_SIZE of test.txt}, ...}

file=iter(f)

Vous avez créé un itérateur de _io.TextIOWrapper avec des données comme celles-ci : [{read from 0 to 1}, ... {read from n-1 to n}]

next(file)

suivant() est passé par le premier point de file je l'ai lu et imprimé.

Prenons un exemple.

Lecture normale

test.txt

what a beautiful day

Nous allons ouvrir le fichier, iter(), et list() pour ouvrir et itérer à travers tout cela et faire une liste.

In [1]: f = open('test.txt')

In [2]: list(iter(f))
Out[2]: ['what a beautiful day']

Comme prévu.

Modification du fichier après open()

In [1]: f = open('test.txt')

Nous avons ouvert le dossier.

Nous allons maintenant ajouter hello open() à test.txt.

test.txt

what a beautiful day

hello open()

puis iter() et list().

In [2]: list(iter(f))
Out[2]: ['what a beautiful day\n', '\n', 'hello open()']

Le contenu modifié est visible. On peut voir que open() ne lit pas réellement le fichier.

Modification du fichier après iter()

In [1]: f = open('test.txt')

In [2]: i = iter(f)

Nous avons ouvert le fichier et iter() d.

Nous allons maintenant ajouter hello iter()

test.txt

what a beautiful day

hello open()

hello iter()

et ensuite l'énumérer().

In [3]: list(i)
Out[3]: ['what a beautiful day\n', '\n', 'hello open()\n', '\n', 'hello iter()']

Le contenu modifié est visible. On peut aussi voir que iter() ne lit pas réellement le fichier.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X