Je veux sauter les 17 premières lignes lors de la lecture d'un fichier texte.
Disons que le fichier ressemble à:
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
good stuff
Je veux juste les bonnes choses. Ce que je fais est beaucoup plus compliqué, mais c'est la partie qui me pose problème.
Utilisez une tranche, comme ci-dessous:
with open('yourfile.txt') as f:
lines_after_17 = f.readlines()[17:]
Si le fichier est trop volumineux pour être chargé en mémoire:
with open('yourfile.txt') as f:
for _ in range(17):
next(f)
for line in f:
# do stuff
Utilisez itertools.islice
, à partir de l'index 17. Il sautera automatiquement les 17 premières lignes.
import itertools
with open('file.txt') as f:
for line in itertools.islice(f, 17, None): # start=17, stop=None
# process lines
for line in dropwhile(isBadLine, lines):
# process as you see fit
Démo complète:
from itertools import *
def isBadLine(line):
return line=='0'
with open(...) as f:
for line in dropwhile(isBadLine, f):
# process as you see fit
Avantages: Ceci est facilement extensible aux cas où vos lignes de préfixe sont plus compliquées que "0" (mais non interdépendantes).
Cette solution m'a aidé à ignorer le nombre de lignes spécifié par la variable linetostart
. Vous obtenez l'index (int) et la ligne (chaîne) si vous souhaitez en suivre également . Dans votre cas, vous remplacez linetostart par 18, ou affectez 18 à la variable linetostart.
f = open("file.txt", 'r')
for i, line in enumerate(f, linetostart):
#Your code
Voici les résultats de timeit pour les 2 meilleures réponses. Notez que "fichier.txt" est un fichier texte contenant plus de 100 000 lignes de chaîne aléatoire d'une taille de 1 Mo +.
Utiliser itertools:
import itertools
from timeit import timeit
timeit("""with open("file.txt", "r") as fo:
for line in itertools.islice(fo, 90000, None):
line.strip()""", number=100)
>>> 1.604976346003241
Utilisation de deux boucles:
from timeit import timeit
timeit("""with open("file.txt", "r") as fo:
for i in range(90000):
next(fo)
for j in fo:
j.strip()""", number=100)
>>> 2.427317383000627
il est clair que la méthode itertools est plus efficace pour les fichiers volumineux.
Voici une méthode pour obtenir des lignes entre deux numéros de ligne dans un fichier:
import sys
def file_line(name,start=1,end=sys.maxint):
lc=0
with open(s) as f:
for line in f:
lc+=1
if lc>=start and lc<=end:
yield line
s='/usr/share/dict/words'
l1=list(file_line(s,235880))
l2=list(file_line(s,1,10))
print l1
print l2
Sortie:
['Zyrian\n', 'Zyryan\n', 'zythem\n', 'Zythia\n', 'zythum\n', 'Zyzomys\n', 'Zyzzogeton\n']
['A\n', 'a\n', 'aa\n', 'aal\n', 'aalii\n', 'aam\n', 'Aani\n', 'aardvark\n', 'aardwolf\n', 'Aaron\n']
Appelez-le simplement avec un paramètre pour obtenir la ligne n -> EOF
Si vous ne voulez pas lire le fichier entier en mémoire en une fois, vous pouvez utiliser quelques astuces:
Avec next(iterator)
, vous pouvez passer à la ligne suivante:
with open("filename.txt") as f:
next(f)
next(f)
next(f)
for line in f:
print(f)
Bien sûr, c'est un peu moche, alors itertools a un meilleur moyen de faire ça:
from itertools import islice
with open("filename.txt") as f:
# start at line 17 and never stop (None), until the end
for line in islice(f, 17, None):
print(f)