J'utilise une boucle for pour lire un fichier, mais je veux seulement lire des lignes spécifiques, par exemple les lignes 26 et 30. Existe-t-il une fonctionnalité intégrée pour y parvenir?
Merci
J'utilise une boucle for pour lire un fichier, mais je veux seulement lire des lignes spécifiques, par exemple les lignes 26 et 30. Existe-t-il une fonctionnalité intégrée pour y parvenir?
Merci
La réponse rapide:
f=open('filename')
lines=f.readlines()
print lines[26]
print lines[30]
ou:
lines=[26,30]
i=0
f=open('filename')
for line in f:
if i in lines:
print i
i+=1
Il y a une solution plus élégante pour l'extraction du nombre de lignes: linecache (avec l'aimable autorisation de "python: comment faire pour accéder à une ligne particulière dans un énorme fichier texte?", un précédent stackoverflow.com question).
Citant la documentation python lié ci-dessus:
>>> import linecache
>>> linecache.getline('/etc/passwd', 4)
'sys:x:3:3:sys:/dev:/bin/sh\n'
Modifier l' 4
votre numéro de ligne, et que vous êtes sur. Notez que 4 apportera à la cinquième ligne que le compteur est à zéro.
Si le fichier peut être très grande, et causer des problèmes lors de la lecture dans la mémoire, il pourrait être une bonne idée de prendre @Alok des conseils et de l'utilisation d'énumérer().
Pour Conclure:
fileobject.readlines()
ou for line in fileobject
comme une solution rapide pour les petits fichiers. linecache
pour une solution plus élégante, qui sera assez rapide pour la lecture de fichiers, possible à plusieurs reprises.enumerate()
pour les fichiers qui peuvent être très grand et ne rentre pas dans la mémoire. Notez que l'utilisation de cette méthode peut ralentir car le fichier est lu séquentiellement.Rapide et compact approche pourrait être:
def picklines(thefile, whatlines):
return [x for i, x in enumerate(thefile) if i in whatlines]
ce n'accepte aucun fichier ouvert-objet de type thefile
(en laissant place à l'appelant s'il doit être ouvert à partir d'un fichier de disque, ou par courriel.g un socket ou d'autres fichiers stream) et un ensemble de base zéro de la ligne des indices whatlines
, et renvoie une liste, avec une faible empreinte mémoire et vitesse raisonnable. Si le nombre de lignes à retourner est énorme, vous pourriez préférer un générateur:
def yieldlines(thefile, whatlines):
return (x for i, x in enumerate(thefile) if i in whatlines)
qui est à la base seulement bonnes pour la lecture en boucle sur -- noter que la seule différence vient de l'utilisation arrondis plutôt que de la place des parenthèses dans l' return
déclaration, faire une liste de compréhension et d'un générateur d'expression, respectivement.
Notons en outre que, malgré la mention de "lignes" et "fichier" ces fonctions sont beaucoup, beaucoup plus généraux, et qu'ils vont travailler sur tout objet iterable, que ce soit un fichier ouvert ou tout autre, en retournant une liste (ou générateur) des éléments en fonction de leur progressive de l'élément numéros. Donc, je vous conseille d'utiliser de façon plus appropriée les noms généraux;-).
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.