197 votes

Comment lire les N premières lignes d'un fichier ?

Nous disposons d'un grand fichier de données brutes que nous souhaitons réduire à une taille donnée.

Comment obtenir les N premières lignes d'un fichier texte en python ? Est-ce que le système d'exploitation utilisé aura un effet sur la mise en oeuvre ?

0 votes

Puis-je donner n comme argument de ligne de commande ?

310voto

gnibbler Points 103484

Python 3 :

with open("datafile") as myfile:
    head = [next(myfile) for x in range(N)]
print(head)

Python 2 :

with open("datafile") as myfile:
    head = [next(myfile) for x in xrange(N)]
print head

Voici une autre façon de procéder (à la fois pour Python 2 et 3) :

from itertools import islice

with open("datafile") as myfile:
    head = list(islice(myfile, N))
print(head)

1 votes

Merci, c'est très utile. Quelle est la différence entre les deux ? (en termes de performances, de bibliothèques nécessaires, de compatibilité, etc.)

1 votes

Je m'attends à ce que les performances soient similaires, peut-être que le premier sera légèrement plus rapide. Mais la première ne fonctionnera pas si le fichier n'a pas au moins N lignes. Il est préférable de mesurer les performances par rapport à des données typiques avec lesquelles vous l'utiliserez.

1 votes

L'instruction with fonctionne avec Python 2.6, et nécessite une instruction import supplémentaire avec 2.5. Pour la version 2.4 ou antérieure, vous devez réécrire le code avec un bloc try...except. D'un point de vue stylistique, je préfère la première option, bien que, comme mentionné, la seconde soit plus robuste pour les fichiers courts.

25voto

ghostdog74 Points 86060
N = 10
with open("file.txt", "a") as file:  # the a opens it in append mode
    for i in range(N):
        line = next(file).strip()
        print(line)

3 votes

Pourquoi ouvrir le fichier en mode appendice ?

0 votes

@AMC Je pense que c'est pour ne pas supprimer le fichier, mais nous devrions utiliser 'r' ici à la place.

1 votes

@Kowalski Le mode Append permet d'ajouter des données au fichier, r est en effet le choix le plus logique, je pense.

21voto

G M Points 508

Si vous voulez lire les premières lignes rapidement et que vous ne vous souciez pas de la performance, vous pouvez utiliser .readlines() qui renvoie un objet liste, puis découpe la liste.

Par exemple, pour les 5 premières lignes :

with open("pathofmyfileandfileandname") as myfile:
    firstNlines=myfile.readlines()[0:5] #put here the interval you want

Nota: le fichier entier est lu, il en est de même pour pas le meilleur du point de vue de la performance b est facile à utiliser, rapide à écrire et facile à mémoriser. quelques calculs ponctuels, c'est très pratique

print firstNlines

Un avantage par rapport aux autres réponses est la possibilité de sélectionner facilement la plage de lignes, par exemple en sautant les 10 premières lignes. [10:30] ou les 10 dernières [:-10] ou en ne prenant que les lignes paires [::2] .

11voto

Cro-Magnon Points 918

Ce que je fais, c'est appeler les lignes N en utilisant pandas . Je pense que la performance n'est pas la meilleure, mais par exemple si N=1000 :

import pandas as pd
yourfile = pd.read_csv('path/to/your/file.csv',nrows=1000)

3 votes

Il serait préférable d'utiliser la fonction nrows qui peut être fixée à 1000 et le fichier entier n'est pas chargé. pandas.pydata.org/pandas-docs/stable/generated/ En général, pandas dispose de cette technique et d'autres techniques d'économie de mémoire pour les gros fichiers.

0 votes

Oui, vous avez raison. Je viens de le corriger. Désolé pour l'erreur.

1 votes

Vous pouvez également ajouter sep pour définir un délimiteur de colonne (qui ne devrait pas apparaître dans un fichier non-SVC)

7voto

artdanil Points 1589

Il n'existe pas de méthode spécifique pour lire le nombre de lignes indiqué par l'objet fichier.

Je pense que la méthode la plus simple serait la suivante :

lines =[]
with open(file_name) as f:
    lines.extend(f.readline() for i in xrange(N))

0 votes

C'est quelque chose que j'avais en fait prévu. Cependant, j'ai pensé à ajouter chaque ligne à la liste. Je vous remercie.

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