Quand dois-je toujours utiliser le fichier.read() ou d'un fichier.readlines()?
J'ai remarqué que si je itérer sur un fichier que j'ai ouvert, il est beaucoup plus rapide pour parcourir sans "lu"-ing.
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 2ème boucle prendra environ 1,5 x plus de temps (j'ai utilisé timeit sur exactement le même fichier, et les résultats ont été 0.442 vs 0.660), et donnerait le même résultat.
Alors - quand dois-je toujours utiliser le .read() ou .readlines()?
Depuis, j'ai toujours besoin d'itérer sur le fichier que je suis en train de lire, et après le difficile apprentissage de la manière lente et douloureuse .read() peut être gros - je n'arrive pas à imaginer de l'utiliser à nouveau.
Veuillez préciser. est le
c'est aussi pour readlines(). Étonnamment il n'y a presque pas de différence de temps entre read() ou readlines()...
timeit
mesure pour read
, ou pour readlines
? Je m'attends à de la read
boucle à prendre plus de temps parce qu'il renvoie une chaîne unique, une itération sur elle irait caractère par caractère. Si votre fichier est en moyenne de 100 caractères par ligne, puis le code de la for line in l.read()
boucle exécute une centaine de fois, autant de fois que le code de la for line in l:
boucle.c'est aussi pour readlines(). Étonnamment il n'y a presque pas de différence de temps entre read() ou readlines()...
OriginalL'auteur David Refaeli | 2016-06-29
Vous devez vous connecter pour publier un commentaire.
La réponse courte à votre question, c'est que chacune de ces trois méthodes de lecture des bits d'un fichier ont différents cas d'utilisation. Comme indiqué ci-dessus, f.read() lit le fichier tant qu'individu chaîne, et donc relativement facile de fichiers à l'échelle de manipulations, tel qu'un fichier à l'échelle de la regex de recherche ou de substitution.
f.readline() lit une seule ligne du fichier, permettant à l'utilisateur d'analyser une seule ligne, sans nécessairement la lecture de tout fichier. À l'aide de f.readline() permet également de faciliter l'application de la logique à la lecture du fichier d'une ligne par ligne itération, par exemple lorsqu'un fichier changements de format en cours.
L'aide 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:
Il a été précédemment affirmé que readline() peut être utilisé pour sauter une ligne pendant une boucle d'itération. Toutefois, cela ne fonctionne pas en python 2.7, et est peut-être une pratique incertaine, de sorte que cette demande a été retirée.
EDIT:
Ajout d'un exemple d'un cas d'utilisation de f.readline() et f.read()
readline
avec unfor
boucle sur le fichier ne fait pas travailler;readline
ne comprend pas lanext
mise en œuvre de la mise en mémoire tampon. Si vous voulez sauter une ligne dans unfor
boucle, vous devriez appelernext
sur le fichier.Je viens de testé avec python 3.4. readline() apparaît à déplacer la boucle de la mémoire tampon de l'avant. Laissez-moi vérifier python 2 vraiment rapide
Ah, vous êtes bon pour python 2.7. Je vais modifier ma réponse. Merci, c'est bon à savoir!
pouvez-vous donner un exemple où l'on fait usage de la lecture()? Le seul que je peux penser est que si vous stocker un mot de passe dans un fichier et que vous voulez le lire - puis à l'aide de l' .read() serait juste un peu plus rapide que la pour l dans le fichier de code. Mais pour le fonctionnement normal de la taille du fichier...?
Ajouté. N'est que l'exemple de l'aider à libérer votre question? Je peux donner un exemple de mise à la terre si nécessaire.
OriginalL'auteur Checkmate
Espérons que cette aide!
https://docs.python.org/2/tutorial/inputoutput.html#methods-of-file-objects
Désolé pour toutes les éditions!
J'ai pensé que je ne serais pas très bien l'expliquer, c'est pourquoi j'ai tiré le reste de ma réponse directement à partir de la documentation.
C n'a pas de valeur par défaut pour la lecture de fichiers ligne par ligne. Il n'y a même pas une fonction standard pour la lecture de fichiers ligne par ligne dans C;
getline
est une extension POSIX. Aussi, la boucle surf.read()
ne pas lire le fichier en entier à chaque itération, et il n'a pas d'itérer sur les lignes.Je ne faisait pas référence à getline, plutôt fscanf.
fscanf ne pas lire les lignes.
OriginalL'auteur Rudi
Eesssketit
Qui était une brillante réponse. /Quelque chose de bon à savoir, c'est que wheneever vous utilisez la readline() de la fonction, il lit une ligne..... et puis il ne sera pas en mesure de le lire de nouveau. Vous pouvez revenir à la position en utilisant le
seek()
fonction. pour revenir à la position zéro il suffit de taper dansf.seek(0)
.Semblable, la fonction
f.tell()
vous permettra de savoir à quelle position vous êtes.OriginalL'auteur Danny