2025 votes

Comment lire un fichier ligne par ligne dans une liste ?

Comment lire chaque ligne d'un fichier en Python et stocker chaque ligne comme un élément d'une liste ?

Je veux lire le fichier ligne par ligne et ajouter chaque ligne à la fin de la liste.

2905voto

SilentGhost Points 79627

Ce code va lire le fichier entier en mémoire :

with open(filename) as file:
    lines = file.readlines()

Si vous voulez supprimer tous les caractères d'espacement (nouvelles lignes et espaces) à la fin de chaque ligne, utilisez plutôt ceci :

with open(filename) as file:
    lines = [line.rstrip() for line in file]

(Cela évite d'allouer une liste supplémentaire de file.readlines() .)

Si vous travaillez avec un fichier volumineux, vous devriez plutôt le lire et le traiter ligne par ligne :

with open(filename) as file:
    for line in file:
        print(line.rstrip())

En Python 3.8 et plus, vous pouvez utiliser une boucle while avec l'option opérateur de morses comme ça :

with open(filename) as file:
    while line := file.readline():
        print(line.rstrip())

123 votes

Dans le cas où vous travaillez avec les Big Data en utilisant readlines() n'est pas très efficace car elle peut entraîner Erreur de mémoire . Dans ce cas, il est préférable d'itérer sur le fichier à l'aide de la fonction for line in f: et de travailler avec chaque line variable.

19 votes

J'ai vérifié le profil de mémoire des différentes manières données dans les réponses en utilisant la procédure mentionnée. aquí . L'utilisation de la mémoire est bien meilleure lorsque chaque ligne est lue à partir du fichier et traitée, comme suggéré par @DevShark. aquí . Le maintien de toutes les lignes dans un objet de collection est no une bonne idée si la mémoire est une contrainte ou si le fichier est volumineux. Le temps d'exécution est similaire dans les deux approches.

8 votes

Aussi, .rstrip() fonctionnera un peu plus vite si vous supprimez les espaces à la fin des lignes.

1208voto

Felix Kling Points 247451

Voir Entrée et sortie :

with open('filename') as f:
    lines = f.readlines()

ou en supprimant le caractère de nouvelle ligne :

with open('filename') as f:
    lines = [line.rstrip('\n') for line in f]

103 votes

Mieux, utiliser f.read().splitlines() qui supprime les nouvelles lignes

1 votes

La deuxième version, avec for line in open(filename) sûr ? Autrement dit, le dossier sera-t-il automatiquement fermé ?

4 votes

Il est préférable de lire le fichier une ligne à la fois plutôt que de lire l'ensemble du fichier en mémoire en une seule fois. Cette méthode n'est pas adaptée aux gros fichiers d'entrée. Voir la réponse de Robert ci-dessous.

712voto

robert Points 10493

Ceci est plus explicite que nécessaire, mais fait ce que vous voulez.

with open("file.txt") as file_in:
    lines = []
    for line in file_in:
        lines.append(line)

45 votes

Je préfère cette réponse car elle ne nécessite pas de charger tout le fichier en mémoire (dans ce cas, il est toujours annexé à array mais il peut y avoir d'autres circonstances). Il est certain que pour les gros fichiers, cette approche pourrait atténuer les problèmes.

4 votes

L'ajout à un tableau est lent. Je ne vois pas de cas d'utilisation où cette solution serait la meilleure.

0 votes

@haccks c'est mieux parce que ça ne charge pas tout le fichier en mémoire ou il y a plus ?

317voto

Noctis Skytower Points 5137

Cela donnera un "tableau" de lignes du fichier.

lines = tuple(open(filename, 'r'))

open renvoie un fichier qui peut être itéré. Lorsque vous itérez sur un fichier, vous obtenez les lignes de ce fichier. tuple peut prendre un itérateur et instancier une instance de tuple pour vous à partir de l'itérateur que vous lui donnez. lines est un tuple créé à partir des lignes du fichier.

1 votes

C'est la meilleure réponse si vous voulez que les caractères de nouvelle ligne y figurent. Y a-t-il un moyen de la modifier pour les supprimer sans ruiner la belle simplicité de cette version ?

43 votes

@MarshallFarrier Essayez lines = open(filename).read().split('\n') à la place.

26 votes

Ferme-t-il le fichier ?

234voto

Eneko Alonso Points 2970

Si vous voulez le \n inclus :

with open(fname) as f:
    content = f.readlines()

Si vous ne voulez pas \n inclus :

with open(fname) as f:
    content = f.read().splitlines()

0 votes

Super, il contient une chaîne vide entre chaque ligne. '1\n2\n3\n' => [ '1', '', '2', '', '3', '' ]

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