291 votes

Lecture de lignes spécifiques uniquement (Python)

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

340voto

Alok Singhal Points 33073

Si le fichier à lire est volumineux et que vous ne voulez pas lire tout le fichier en mémoire à la fois:

 fp = open("file")
for i, line in enumerate(fp):
    if i == 25:
        # 26th line
    elif i == 29:
        # 30th line
    elif i > 29:
        break
fp.close()
 

Notez que i == n-1 pour la n ème ligne.

201voto

Adam Matan Points 15690

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:

  • Utiliser fileobject.readlines() ou for line in fileobject comme une solution rapide pour les petits fichiers.
  • Utiliser linecache pour une solution plus élégante, qui sera assez rapide pour la lecture de fichiers, possible à plusieurs reprises.
  • Prenez @Alok des conseils et de l'utiliser 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.

42voto

KingMak Points 314

Pour proposer une autre solution:

 import linecache
linecache.getline('Sample.txt', Number_of_Line)
 

J'espère que c'est rapide et facile :)

37voto

Alex Martelli Points 330805

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;-).

15voto

MadSc13ntist Points 72

si vous voulez la ligne 7

line = open ("fichier.txt", "r"). readlines () [7]

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