Comment lire chaque ligne d'un fichier en Python et stocker chaque ligne en tant qu'élément dans une liste?
Je veux lire le fichier ligne par ligne et ajouter chaque ligne à la fin de la liste.
with open(filename) as f:
content = f.readlines()
# you may also want to remove whitespace characters like `\n` at the end of each line
content = [x.strip() for x in content]
file.readlines()
dans unfor
-loop, un objet fichier lui-même suffit:lines = [line.rstrip('\n') for line in file]
readlines()
n'est pas très efficace car elle peut entraîner MemoryError . Dans ce cas, il est préférable de parcourir le fichier en utilisantfor line in f:
et en travaillant avec chaqueline
variable..rstrip()
cela fonctionnera un peu plus rapidement si vous supprimez les espaces des extrémités des lignes.with open(filename) as f: content = [i.strip() for i in f.readlines()]
Voir Entrée et sortie :
ou en supprimant le caractère de nouvelle ligne:
la source
f.read().splitlines()
, qui supprime les sauts de lignefor line in open(filename)
sécurisée? Autrement dit, le dossier sera-t-il fermé automatiquement?lines = [x.rstrip('\n') for x in open('data\hsf.txt','r')]
Si j'écris de cette façon, comment puis-je fermer le fichier après la lecture?open
sans le gestionnaire de contexte (ou une autre manière garantie de le fermer), ce n'est pas vraiment un de ces cas - lorsque l'objet n'a plus de références il sera récupéré et le fichier fermé, ce qui devrait se produire immédiatement en cas d'erreur ou non, lorsque la compréhension de la liste sera terminée.C'est plus explicite que nécessaire, mais fait ce que vous voulez.
la source
array
, mais il peut y avoir d'autres circonstances). Pour les gros fichiers, cette approche pourrait certainement atténuer les problèmes.Cela produira un "tableau" de lignes à partir du fichier.
open
renvoie un fichier qui peut être itéré. Lorsque vous parcourez 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.la source
lines = open(filename).read().split('\n')
plutôt.lines = open(filename).read().splitlines()
un peu plus propre, et je crois qu'il gère également mieux les fins de ligne DOS.list
occupe environ 13,22% plus d'espace qu'un atuple
. Les résultats viennent defrom sys import getsizeof as g; i = [None] * 1000; round((g(list(i)) / g(tuple(i)) - 1) * 100, 2)
. La création d'untuple
prend environ 4,17% plus de temps que la création d'unlist
(avec un écart type de 0,16%). Les résultats proviennent defrom timeit import timeit as t; round((t('tuple(i)', 'i = [None] * 1000') / t('list(i)', 'i = [None] * 1000') - 1) * 100, 2)
30 exécutions . Ma solution privilégie l'espace à la vitesse lorsque le besoin de mutabilité est inconnu.Si vous voulez l'
\n
inclus:Si vous ne voulez pas
\n
inclus:la source
Selon les méthodes d'objets de fichier de Python , la façon la plus simple de convertir un fichier texte en un
list
est:Si vous avez juste besoin d'itérer sur les lignes du fichier texte, vous pouvez utiliser:
Ancienne réponse:
Utilisation de
with
etreadlines()
:Si vous ne vous souciez pas de fermer le fichier, ce one-liner fonctionne:
La manière traditionnelle :
la source
Vous pouvez simplement faire ce qui suit, comme cela a été suggéré:
Notez que cette approche a 2 inconvénients:
1) Vous stockez toutes les lignes en mémoire. Dans le cas général, c'est une très mauvaise idée. Le fichier peut être très volumineux et vous risquez de manquer de mémoire. Même si ce n'est pas grand, c'est simplement un gaspillage de mémoire.
2) Cela ne permet pas de traiter chaque ligne pendant que vous les lisez. Donc, si vous traitez vos lignes après cela, ce n'est pas efficace (nécessite deux passes plutôt qu'une).
Une meilleure approche pour le cas général serait la suivante:
Où vous définissez votre fonction de processus comme vous le souhaitez. Par exemple:
(La mise en œuvre de la
Superman
classe est laissée comme un exercice pour vous).Cela fonctionnera parfaitement pour n'importe quelle taille de fichier et vous parcourez votre fichier en un seul passage. C'est généralement ainsi que fonctionneront les analyseurs génériques.
la source
open('file_path', 'r+')
Données dans la liste
Supposons que nous ayons un fichier texte avec nos données comme dans les lignes suivantes,
Contenu du fichier texte:
python
et dans l'interpréteur écrivez:Le script Python:
En utilisant append:
Ou:
Ou:
Ou:
production:
la source
read().splitlines()
est fourni par Python: c'est tout simplementreadlines()
(ce qui est probablement plus rapide, car c'est moins de gaspillage).read().splitlines()
etreadlines()
ne produit pas la même sortie. Êtes-vous sûr qu'ils sont équivalents?strip()
doit êtrerstrip("\n")
ou les espaces autour d'une ligne sont supprimés. De plus, cela ne sert à rien dereadlines()
comprendre une liste: il est préférable d'itérer simplement sur le fichier, car cela ne perd pas de temps et de mémoire en créant une liste intermédiaire des lignes.Pour lire un fichier dans une liste, vous devez faire trois choses:
Heureusement, Python permet de faire ces choses très facilement, donc le moyen le plus court de lire un fichier dans une liste est:
Cependant, je vais ajouter quelques explications supplémentaires.
Ouverture du dossier
Je suppose que vous voulez ouvrir un fichier spécifique et que vous ne traitez pas directement avec un descripteur de fichier (ou un descripteur de type fichier). La fonction la plus utilisée pour ouvrir un fichier en Python est
open
, elle prend un argument obligatoire et deux optionnels en Python 2.7:Le nom de fichier doit être une chaîne qui représente le chemin d'accès au fichier . Par exemple:
Notez que l'extension de fichier doit être spécifiée. Ceci est particulièrement important pour les utilisateurs de Windows car les extensions de fichiers comme
.txt
ou.doc
, etc. sont masquées par défaut lorsqu'elles sont affichées dans l'explorateur.Le deuxième argument est le
mode
, c'estr
par défaut ce qui signifie "lecture seule". C'est exactement ce dont vous avez besoin dans votre cas.Mais si vous voulez réellement créer un fichier et / ou écrire dans un fichier, vous aurez besoin d'un argument différent ici. Il y a une excellente réponse si vous voulez un aperçu .
Pour lire un fichier, vous pouvez omettre le
mode
ou le transmettre explicitement:Les deux ouvriront le fichier en mode lecture seule. Si vous souhaitez lire un fichier binaire sous Windows, vous devez utiliser le mode
rb
:Sur d'autres plateformes, le
'b'
(mode binaire) est simplement ignoré.Maintenant que j'ai montré comment archiver
open
le fichier, parlons du fait que vous en aurez toujours besoinclose
. Sinon, il conservera un descripteur de fichier ouvert jusqu'à ce que le processus se termine (ou que Python récupère le descripteur de fichier).Bien que vous puissiez utiliser:
Cela ne fermera pas le fichier lorsque quelque chose entre
open
etclose
lève une exception. Vous pouvez éviter cela en utilisant untry
etfinally
:Cependant, Python fournit des gestionnaires de contexte qui ont une syntaxe plus jolie (mais pour
open
elle, elle est presque identique à celle citry
-finally
dessus):La dernière approche est l' approche recommandée pour ouvrir un fichier en Python!
Lecture du fichier
D'accord, vous avez ouvert le fichier, maintenant comment le lire?
La
open
fonction renvoie unfile
objet et prend en charge le protocole d'itération Pythons. Chaque itération vous donnera une ligne:Cela imprimera chaque ligne du fichier. Notez cependant que chaque ligne contiendra un caractère de nouvelle ligne
\n
à la fin (vous voudrez peut-être vérifier si votre Python est construit avec la prise en charge universelle des nouvelles lignes - sinon vous pourriez également avoir\r\n
sur Windows ou\r
Mac en tant que nouvelles lignes). Si vous ne le souhaitez pas, vous pouvez simplement supprimer le dernier caractère (ou les deux derniers caractères sous Windows):Mais la dernière ligne n'a pas nécessairement de retour à la ligne, donc il ne faut pas l'utiliser. On pourrait vérifier s'il se termine par un retour à la ligne de fin et si oui, supprimez-le:
Mais vous pouvez simplement supprimer tous les espaces blancs (y compris le
\n
caractère) de la fin de la chaîne , cela supprimera également tous les autres espaces blancs de fin , vous devez donc faire attention si ceux-ci sont importants:Cependant si les lignes se terminent par
\r\n
("newlines" Windows) cela.rstrip()
prendra également soin de\r
!Stockez le contenu sous forme de liste
Maintenant que vous savez comment ouvrir le fichier et le lire, il est temps de stocker le contenu dans une liste. L'option la plus simple serait d'utiliser la
list
fonction:Si vous souhaitez supprimer les sauts de ligne de fin, vous pouvez utiliser une compréhension de liste à la place:
Ou encore plus simple: la
.readlines()
méthode de l'file
objet renvoie par défaut unelist
des lignes:Cela inclura également les caractères de fin de ligne, si vous ne les voulez pas, je recommanderais l'
[line.rstrip() for line in f]
approche car cela évite de garder deux listes contenant toutes les lignes en mémoire.Il existe une option supplémentaire pour obtenir la sortie souhaitée, mais elle est plutôt "sous-optimale":
read
le fichier complet dans une chaîne, puis divisé sur les retours à la ligne:ou:
Ceux-ci prennent automatiquement en charge les sauts de ligne de fin car le
split
personnage n'est pas inclus. Cependant, elles ne sont pas idéales car vous conservez le fichier sous forme de chaîne et de liste de lignes en mémoire!Sommaire
with open(...) as f
lors de l'ouverture de fichiers car vous n'avez pas besoin de vous occuper de la fermeture du fichier vous-même et il ferme le fichier même si une exception se produit.file
les objets prennent en charge le protocole d'itération, la lecture d'un fichier ligne par ligne est donc aussi simple quefor line in the_file_object:
.readlines()
mais si vous voulez traiter les lignes avant de les stocker dans la liste, je recommanderais une simple compréhension de la liste.la source
Manière claire et pythonique de lire les lignes d'un fichier dans une liste
Avant tout, vous devez vous concentrer sur l'ouverture de votre fichier et la lecture de son contenu de manière efficace et pythonique. Voici un exemple de la façon dont je ne préfère pas personnellement:
Au lieu de cela, je préfère la méthode ci-dessous pour ouvrir des fichiers à la fois en lecture et en écriture car elle est très propre et ne nécessite pas d'étape supplémentaire de fermeture du fichier une fois que vous avez fini de l'utiliser. Dans l'instruction ci-dessous, nous ouvrons le fichier en lecture et l'assignons à la variable «infile». Une fois le code de cette instruction terminé, le fichier sera automatiquement fermé.
Nous devons maintenant nous concentrer sur l'intégration de ces données dans une liste Python car elles sont itérables, efficaces et flexibles. Dans votre cas, l'objectif souhaité est de placer chaque ligne du fichier texte dans un élément distinct. Pour ce faire, nous utiliserons la méthode splitlines () comme suit:
Le produit final:
Test de notre code:
la source
Introduit dans Python 3.4,
pathlib
a une méthode très pratique pour lire du texte à partir de fichiers, comme suit:(L'
splitlines
appel est ce qui le transforme d'une chaîne contenant tout le contenu du fichier en une liste de lignes dans le fichier).pathlib
a beaucoup de commodités pratiques en elle.read_text
est agréable et concis, et vous n'avez pas à vous soucier de l'ouverture et de la fermeture du fichier. Si tout ce que vous avez à faire avec le fichier est de le lire en une seule fois, c'est un bon choix.la source
Voici une autre option en utilisant des compréhensions de liste sur les fichiers;
Cela devrait être plus efficace car la plupart du travail se fait à l'intérieur de l'interpréteur Python.
la source
rstrip()
supprime potentiellement tous les espaces de fin, pas seulement le\n
; utiliser.rstrip('\n')
.Maintenant, la variable out est une liste (tableau) de ce que vous voulez. Vous pouvez soit faire:
Ou:
Vous obtiendrez les mêmes résultats.
la source
Lire et écrire des fichiers texte avec Python 2 et Python 3; cela fonctionne avec Unicode
A noter:
with
est un soi-disant gestionnaire de contexte . Il s'assure que le fichier ouvert est refermé..strip()
ou.rstrip()
ne reproduiront pas lelines
car elles dépouillent également l'espace blanc.Terminaisons de fichiers communes
.txt
Écriture / lecture de fichiers plus avancées
Pour votre application, les éléments suivants peuvent être importants:
Voir aussi: Comparaison des formats de sérialisation des données
Dans le cas où vous cherchez plutôt un moyen de créer des fichiers de configuration, vous voudrez peut-être lire mon court article Fichiers de configuration en Python .
la source
Une autre option est
numpy.genfromtxt
, par exemple:Cela fera
data
un tableau NumPy avec autant de lignes qu'il y a dans votre fichier.la source
Si vous souhaitez lire un fichier depuis la ligne de commande ou depuis stdin, vous pouvez également utiliser le
fileinput
module:Passez-y des fichiers comme ceci:
En savoir plus ici: http://docs.python.org/2/library/fileinput.html
la source
La façon la plus simple de le faire
Un moyen simple consiste à:
En une ligne, cela donnerait:
Cependant, c'est assez inefficace car cela stockera 2 versions du contenu en mémoire (probablement pas un gros problème pour les petits fichiers, mais quand même). [Merci Mark Amery].
Il existe 2 façons plus simples:
pathlib
créer un chemin d'accès à votre fichier que vous pourriez utiliser pour d'autres opérations dans votre programme:la source
.read().splitlines()
n'est en aucun cas "plus simple" que d'appeler.readlines()
. Pour un autre, il est inefficace en mémoire; vous stockez inutilement deux versions du contenu du fichier (la chaîne unique renvoyée par.read()
et la liste des chaînes renvoyées parsplitlines()
) en mémoire à la fois.Utilisez simplement les fonctions splitlines (). Voici un exemple.
Dans la sortie, vous aurez la liste des lignes.
la source
.readlines()
. Cela met deux copies du contenu du fichier en mémoire à la fois (une sous forme de chaîne énorme unique, une sous forme de liste de lignes).Si vous voulez être confronté à un fichier très volumineux / volumineux et que vous souhaitez lire plus rapidement (imaginez que vous êtes dans un concours de codage Topcoder / Hackerrank), vous pouvez lire un bloc de lignes considérablement plus grand dans un tampon mémoire à la fois, plutôt que il suffit d'itérer ligne par ligne au niveau du fichier.
la source
process(line)
est une fonction que vous devez implémenter pour traiter les données. par exemple, au lieu de cette ligne, si vous utilisezprint(line)
, il imprimera chaque ligne à partir du lines_buffer.Les moyens les plus simples de le faire avec certains avantages supplémentaires sont les suivants:
ou
ou
Dans le cas de
set
, nous devons nous rappeler que nous n'avons pas l'ordre des lignes préservé et nous débarrasser des lignes dupliquées.Ci-dessous, j'ai ajouté un supplément important de @MarkAmery :
la source
.close
l'objet fichier ni n'utilisez unewith
instruction, dans certaines implémentations Python, le fichier peut ne pas être fermé après la lecture et votre processus perdra un descripteur de fichier ouvert. En CPython (l'implémentation Python normale que la plupart des gens utilisent), ce n'est pas un problème car l'objet fichier sera immédiatement récupéré et cela fermera le fichier, mais il est néanmoins généralement considéré comme la meilleure pratique de faire quelque chose commewith open('filename') as f: lines = list(f)
pour s'assurer que le fichier est fermé quelle que soit l'implémentation Python que vous utilisez.Utilisez ceci:
data
est un type de trame de données et utilise des valeurs pour obtenir ndarray. Vous pouvez également obtenir une liste en utilisantarray.tolist()
.la source
pandas.read_csv()
est pour la lecture des données CSV , comment est-il approprié ici?Aperçu et résumé
Avec un
filename
, en manipulant le fichier à partir d'unPath(filename)
objet, ou directement avecopen(filename) as f
, effectuez l'une des opérations suivantes:list(fileinput.input(filename))
with path.open() as f
, appelerf.readlines()
list(f)
path.read_text().splitlines()
path.read_text().splitlines(keepends=True)
fileinput.input
ouf
etlist.append
chaque ligne une à la foisf
à une limitelist.extend
méthodef
dans une liste de compréhensionJ'explique le cas d'utilisation pour chacun ci-dessous.
Ceci est une excellente question. Commençons par créer des exemples de données:
Les objets fichier sont des itérateurs paresseux, il suffit donc d'itérer dessus.
Alternativement, si vous avez plusieurs fichiers, utilisez
fileinput.input
un autre itérateur paresseux. Avec un seul fichier:ou pour plusieurs fichiers, passez-lui une liste de noms de fichiers:
Encore
f
etfileinput.input
surtout, les deux sont / retournent des itérateurs paresseux. Vous ne pouvez utiliser un itérateur qu'une seule fois, donc pour fournir du code fonctionnel tout en évitant la verbosité, j'utiliserai le légèrement plus concisfileinput.input(filename)
où il est proposé d'ici.Ah mais vous le voulez dans une liste pour une raison quelconque? J'éviterais cela si possible. Mais si vous insistez ... passez simplement le résultat de
fileinput.input(filename)
àlist
:Une autre réponse directe consiste à appeler
f.readlines
, qui renvoie le contenu du fichier (jusqu'à unhint
nombre facultatif de caractères, vous pouvez donc décomposer en plusieurs listes de cette façon).Vous pouvez accéder à cet objet fichier de deux manières. Une façon consiste à passer le nom de fichier au
open
module intégré:ou en utilisant le nouvel objet Path du
pathlib
module (que j'aime beaucoup et que j'utiliserai à partir de maintenant):list
consommera également l'itérateur de fichier et renverra une liste - une méthode assez directe également:Si cela ne vous dérange pas de lire le texte entier en mémoire comme une seule chaîne avant de le fractionner, vous pouvez le faire en une ligne avec l'
Path
objet et lasplitlines()
méthode de chaîne. Par défaut,splitlines
supprime les sauts de ligne:Si vous souhaitez conserver les nouvelles lignes, passez
keepends=True
:Maintenant, c'est un peu idiot de demander, étant donné que nous avons facilement démontré le résultat final avec plusieurs méthodes. Mais vous devrez peut-être filtrer ou opérer sur les lignes lors de la création de votre liste, alors humorisons cette demande.
L'utilisation
list.append
vous permettrait de filtrer ou d'opérer sur chaque ligne avant de l'ajouter:L'utilisation
list.extend
serait un peu plus directe, et peut-être utile si vous avez une liste préexistante:Ou plus idiomatiquement, nous pourrions plutôt utiliser une liste de compréhension, et mapper et filtrer à l'intérieur si cela est souhaitable:
Ou encore plus directement, pour fermer le cercle, il suffit de le passer à list pour créer directement une nouvelle liste sans opérer sur les lignes:
Conclusion
Vous avez vu de nombreuses façons d'obtenir des lignes d'un fichier dans une liste, mais je vous recommande d'éviter de matérialiser de grandes quantités de données dans une liste et d'utiliser à la place l'itération paresseuse de Python pour traiter les données si possible.
Autrement dit, préférez
fileinput.input
ouwith path.open() as f
.la source
Dans le cas où il y a aussi des lignes vides dans le document, j'aime lire le contenu et le passer
filter
pour éviter les éléments de chaîne videsla source
Vous pouvez également utiliser la commande loadtxt dans NumPy. Cela vérifie moins de conditions que genfromtxt, il peut donc être plus rapide.
la source
J'aime utiliser ce qui suit. Lecture immédiate des lignes.
Ou en utilisant la compréhension de liste:
la source
readlines()
, ce qui entraîne même une pénalité de mémoire. Vous pouvez simplement le supprimer, car l'itération sur un fichier (texte) donne chaque ligne tour à tour.with
instruction pour ouvrir (et fermer implicitement) le fichier.J'essaierais l'une des méthodes mentionnées ci-dessous. Le fichier d'exemple que j'utilise porte le nom
dummy.txt
. Vous pouvez trouver le fichier ici . Je suppose que le fichier se trouve dans le même répertoire que le code (vous pouvez modifierfpath
pour inclure le nom de fichier et le chemin de dossier appropriés.)Dans les deux exemples mentionnés ci-dessous, la liste que vous souhaitez est donnée par
lst
.1.> Première méthode :
2.> Dans la deuxième méthode , on peut utiliser le module csv.reader de la bibliothèque standard Python :
Vous pouvez utiliser l'une des deux méthodes. Le temps nécessaire à la création de
lst
est presque égal dans les deux méthodes.la source
delimiter=' '
argument?Voici une classe de
bibliothèque d'assistance Python (3) que j'utilise pour simplifier les E / S de fichiers:Vous utiliseriez alors la
FileIO.lines
fonction, comme ceci:N'oubliez pas que
mode
("r"
par défaut) etfilter_fn
paramètres (vérifie les lignes vides par défaut) sont facultatifs.Vous pouvez même retirer les
read
,write
et lesdelete
méthodes et juste laisser leFileIO.lines
, ou même en faire une méthode distincte appeléeread_lines
.la source
lines = FileIO.lines(path)
vraiment assez simplewith open(path) as f: lines = f.readlines()
pour justifier l'existence de cet assistant? Vous économisez, par exemple, 17 caractères par appel. (Et la plupart du temps, pour des raisons de performances et de mémoire, vous voudrez boucler directement sur un objet fichier au lieu de lire ses lignes dans une liste de toute façon, donc vous ne voudrez même pas l'utiliser souvent!) souvent fan de créer de petites fonctions utilitaires, mais celui-ci me semble comme créer simplement inutilement une nouvelle façon d'écrire quelque chose qui est déjà court et facile avec la bibliothèque standard.Version en ligne de commande
Courir avec:
la source