web-dev-qa-db-fra.com

Quand devrais-je utiliser file.read () ou file.readlines ()?

J'ai remarqué que si je parcourais un fichier que j'avais ouvert, il était beaucoup plus rapide de le parcourir sans le "lire". 

c'est à dire. 

l = open('file','r')
for line in l:
    pass (or code)

est beaucoup plus rapide que 

l = open('file','r')
for line in l.read() / l.readlines():
    pass (or code)

La deuxième boucle prendra environ 1,5 fois plus de temps (j'ai utilisé timeit sur le même fichier, et les résultats étaient de 0,442 contre 0,660), et donneraient le même résultat. 

Alors, quand devrais-je utiliser les fichiers .read () ou .readlines ()? 

Étant donné que j'ai toujours besoin de parcourir le fichier que je lis et après avoir appris à quel point il est péniblement lent de ralentir le .read () peut être sur de grandes données - je n'arrive pas à imaginer l'utiliser à nouveau. 

13
David Refaeli

La réponse courte à votre question est que chacune de ces trois méthodes de lecture de bits d’un fichier a des cas d’utilisation différents. Comme indiqué ci-dessus, f.read () lit le fichier sous forme de chaîne individuelle et permet ainsi des manipulations relativement simples, telles qu'une recherche ou une substitution regex sur l'ensemble du fichier.

f.readline () lit une seule ligne du fichier, ce qui permet à l'utilisateur d'analyser une seule ligne sans nécessairement lire le fichier en entier. L'utilisation de f.readline () permet également une application plus facile de la logique dans la lecture du fichier qu'une itération ligne par ligne complète, par exemple lorsqu'un fichier est modifié en cours de format.

L'utilisation de la syntaxe for line in f: permet à l'utilisateur de parcourir le fichier ligne par ligne comme indiqué dans la question.

(Comme indiqué dans l'autre réponse, cette documentation est une très bonne lecture):

https://docs.python.org/2/tutorial/inputoutput.html#methods-of-file-objects

EDIT: On avait précédemment prétendu que readline () pouvait être utilisé pour ignorer une ligne lors d'une itération de boucle for. Cependant, cela ne fonctionne pas dans python 2.7, et est peut-être une pratique discutable, donc cette affirmation a été supprimée.

EDIT: Ajout d'un exemple de cas d'utilisation de f.readline () et f.read () 

9
Checkmate

J'espère que cela t'aides!

https://docs.python.org/2/tutorial/inputoutput.html#methods-of-file-objects

Lorsque la taille est omise ou négative, tout le contenu du fichier est lu et renvoyé. c’est votre problème si le fichier est deux fois plus volumineux que la mémoire de votre machine

Désolé pour toutes les modifications!

Pour lire les lignes d’un fichier, vous pouvez effectuer une boucle sur l’objet fichier. C'est efficace en mémoire, rapide et conduit à un code simple:

for line in f:
    print line,

This is the first line of the file.
Second line of the file
0
Rudi