85 votes

Sauter les premières lignes lors de la lecture des lignes d'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.

170voto

wim Points 35274

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

1 votes

J'utilise les secondes solutions pour lire dix lignes à la fin d'un fichier de 8 millions (8e6) de lignes et cela prend ~22 secondes. Est-ce toujours la méthode préférée (=la plus rapide) pour des fichiers aussi longs (~250 Mo) ?

1 votes

J'utiliserais tail pour ça.

0 votes

@wim : Je suppose que la queue ne fonctionne pas sous Windows. De plus, je ne veux pas toujours lire les 10 dernières lignes. Je veux pouvoir lire quelques lignes au milieu (par exemple, si je lis 10 lignes après ~4e6 lignes dans le même fichier, cela prend encore la moitié de ce temps, ~11 secondes).

49voto

Ismail Badawi Points 10898

Utilisez itertools.islice à partir de l'indice 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

4voto

ninjagecko Points 25709
for line in dropwhile(isBadLine, lines):
    # process as you see fit

Démonstration 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 pas interdépendantes).

3voto

seriousdev Points 2894

Utilisez f.readlines(17) . Après cela, si vous itérez sur l'objet fichier ou si vous utilisez la fonction f.readline() vous serez à la ligne 18.

3voto

willywonka Points 19

Voici les résultats de timeit pour les 2 premières réponses. Notez que "file.txt" est un fichier texte contenant plus de 100 000 lignes de chaînes de caractères aléatoires avec une taille de fichier de plus de 1 Mo.

Utilisation de 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

En utilisant deux boucles for :

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 lorsqu'il s'agit de gros fichiers.

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