213 votes

Comment lire un fichier texte dans une liste ou un tableau avec Python ?

J'essaie de lire les lignes d'un fichier texte dans une liste ou un tableau en python. J'ai juste besoin de pouvoir accéder individuellement à chaque élément de la liste ou du tableau après sa création.

Le fichier texte est formaté comme suit :

0,0,200,0,53,1,0,255,...,0.

Où le ... est ci-dessus, le fichier texte réel comporte des centaines ou des milliers d'éléments supplémentaires.

J'utilise le code suivant pour essayer de lire le fichier dans une liste :

text_file = open("filename.dat", "r")
lines = text_file.readlines()
print lines
print len(lines)
text_file.close()

Le résultat que j'obtiens est le suivant :

['0,0,200,0,53,1,0,255,...,0.']
1

Apparemment, il lit le fichier entier dans une liste d'un seul élément, plutôt que dans une liste d'éléments individuels. Qu'est-ce que je fais de mal ?

177voto

Achrome Points 4585

Vous devrez diviser votre chaîne de caractères en une liste de valeurs à l'aide de la fonction split()

Donc,

lines = text_file.read().split(',')

EDIT : Je n'avais pas réalisé que ce sujet susciterait autant d'intérêt. Voici une approche plus idiomatique.

import csv
with open('filename.csv', 'r') as fd:
    reader = csv.reader(fd)
    for row in reader:
        # do something

61voto

Thiru Points 164

Vous pouvez également utiliser numpy loadtxt comme

from numpy import loadtxt
lines = loadtxt("filename.dat", comments="#", delimiter=",", unpack=False)

26voto

gboffi Points 3681

Vous voulez donc créer une liste de listes... Nous devons commencer par une liste vide

list_of_lists = []

Ensuite, nous lisons le contenu du fichier, ligne par ligne.

with open('data') as f:
    for line in f:
        inner_list = [elt.strip() for elt in line.split(',')]
        # in alternative, if you need to use the file content as numbers
        # inner_list = [int(elt.strip()) for elt in line.split(',')]
        list_of_lists.append(inner_list)

Un cas d'utilisation courant est celui des données en colonnes, mais nos unités de stockage sont les rangées du fichier, que nous avons lues une par une, donc vous pouvez souhaiter transposer votre liste de listes. Cela peut être fait avec l'idiome suivant

by_cols = zip(*list_of_lists)

Une autre utilisation courante consiste à donner un nom à chaque colonne

col_names = ('apples sold', 'pears sold', 'apples revenue', 'pears revenue')
by_names = {}
for i, col_name in enumerate(col_names):
    by_names[col_name] = by_cols[i]

afin de pouvoir opérer sur des éléments de données homogènes

 mean_apple_prices = [money/fruits for money, fruits in
                     zip(by_names['apples revenue'], by_names['apples_sold'])]

La plupart de ce que j'ai écrit peut être accéléré en utilisant la fonction csv de la bibliothèque standard. Un autre module tiers est pandas qui vous permet d'automatiser la plupart des aspects d'une analyse de données typique (mais qui a un certain nombre de dépendances).


Mise à jour Alors que dans Python 2 zip(*list_of_lists) renvoie une liste différente (transposée) de listes, dans Python 3 la situation a changé et zip(*list_of_lists) renvoie à un objet zip qui n'est pas subscriptable.

Si vous besoin de accès indexé, vous pouvez utiliser

by_cols = list(zip(*list_of_lists))

qui vous donne une liste de listes dans les deux versions de Python.

D'autre part, si vous n'ont pas besoin accès indexé et que ce que vous voulez est juste de construire un dictionnaire indexé par les noms de colonnes, un objet zip est très bien...

file = open('some_data.csv')
names = get_names(next(file))
columns = zip(*((x.strip() for x in line.split(',')) for line in file)))
d = {}
for name, column in zip(names, columns): d[name] = column

8voto

Blairg23 Points 78

Cette question demande comment lire le contenu des valeurs séparées par des virgules d'un fichier dans une liste itérable :

0,0,200,0,53,1,0,255,...,0.

La façon la plus simple de le faire est d'utiliser la fonction csv comme suit :

import csv
with open('filename.dat', newline='') as csvfile:
    spamreader = csv.reader(csvfile, delimiter=',')

Maintenant, vous pouvez facilement itérer sur spamreader comme ça :

for row in spamreader:
    print(', '.join(row))

Voir documentation pour d'autres exemples.

0voto

Shreyas H.V Points 19

Je suis un peu en retard, mais vous pouvez aussi lire le fichier texte dans un cadre de données, puis convertir la colonne correspondante en liste.

lista=pd.read_csv('path_to_textfile.txt', sep=",", header=None)[0].tolist() 

exemple.

lista=pd.read_csv('data/holdout.txt',sep=',',header=None)[0].tolist()

Note : le nom de la colonne du dataframe correspondant sera sous forme d'entiers et j'ai choisi 0 car je n'extrayais que la première colonne.

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