web-dev-qa-db-fra.com

Ignorer les deux premières lignes lors de la lecture de lignes dans un fichier Python

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.

43
O.rka

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
87
wim

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
23
Ismail Badawi
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).

2
ninjagecko

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
2
Wilder

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.

0
willywonka

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

0
the wolf

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)
0
Azsgy