Un fichier csv names.csv
a du contenu:
first_name last_name
Baked Beans
Lovely Spam
Wonderful Spam
Je voudrais le lire dans une liste de dictionnaires, avec la première ligne contenant les clés:
>>> import csv
>>> with open('names.csv') as csvfile:
... reader = csv.DictReader(csvfile)
... for row in reader:
... print(row['first_name'], row['last_name'])
...
Baked Beans
Lovely Spam
Wonderful Spam
Mais est le type de reader
csv.DictReader
? Comment puis-je convertir reader
en une liste de dictionnaires? Merci.
import csv
with open("in.csv") as csvfile:
reader = csv.DictReader(csvfile,delimiter=" ")
print(list(reader))
[{'first_name': 'Baked', 'last_name': 'Beans'}, {'first_name': 'Lovely', 'last_name': 'Spam'}, {'first_name': 'Wonderful', 'last_name': 'Spam'}]
Si le délimiteur n'est pas réellement un ,
vous devez spécifier " "
ou quoi que ce soit.
Juste pour effacer toute confusion, le code fonctionne bien pour python3.6 également, la seule différence est que l'utilisation de DictReader donne Orderdicts par défaut:
In [1]: import csv
...: with open("in.csv") as csvfile:
...: reader = csv.DictReader(csvfile, delimiter=" ")
...: print(list(reader))
...:
[OrderedDict([('first_name', 'Baked'), ('last_name', 'Beans')]), OrderedDict([('first_name', 'Lovely'), ('last_name', 'Spam')]), OrderedDict([('first_name', 'Wonderful'), ('last_name', 'Spam')])]
Vous pouvez accéder aux clés exactement de la même manière, un OrderedDict
conserve simplement l'ordre d'insertion des clés:
In [2]: import csv
...: with open("in.csv") as csvfile:
...: reader = csv.DictReader(csvfile, delimiter=" ")
...: for dct in reader:
...: print(f"{dct['first_name']} {dct['last_name']}")
...:
...:
Baked Beans
Lovely Spam
Wonderful Spam
Quel py3.6 fait aussi, donc si pour une raison quelconque vous voulez vraiment un dict:
In [5]: import csv
...: with open("in.csv") as csvfile:
...: reader = csv.DictReader(csvfile, delimiter=" ")
...: for dct in map(dict, reader):
...: print(dct)
...: print(f"{dct['first_name']} {dct['last_name']}")
...:
...:
{'first_name': 'Baked', 'last_name': 'Beans'}
Baked Beans
{'first_name': 'Lovely', 'last_name': 'Spam'}
Lovely Spam
{'first_name': 'Wonderful', 'last_name': 'Spam'}
Wonderful Spam
Le maintien de l'ordre lors de l'insertion dans py3.6 est un détail d'implémentation et peut changer, mais si nous sommes suffisamment nombreux à l'utiliser, il se peut qu'il doive rester: )
Utilisez list()
:
print(list(reader))
Démo:
>>> with open('names.csv') as csvfile:
... reader = csv.DictReader(csvfile, delimiter=" ")
... print(list(reader))
...
[{'first_name': 'Baked', 'last_name': 'Beans'}, {'first_name': 'Lovely', 'last_name': 'Spam'}, {'first_name': 'Wonderful', 'last_name': 'Spam'}]