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.
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.
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())
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.
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.
Aussi, .rstrip()
fonctionnera un peu plus vite si vous supprimez les espaces à la fin des lignes.
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]
La deuxième version, avec for line in open(filename)
sûr ? Autrement dit, le dossier sera-t-il automatiquement fermé ?
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.
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.
L'ajout à un tableau est lent. Je ne vois pas de cas d'utilisation où cette solution serait la meilleure.
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.
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 ?
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.