J'essaie de créer un dictionnaire à partir d'un fichier csv. La première colonne du fichier csv contient des clés uniques et la seconde colonne contient des valeurs. Chaque ligne du fichier csv représente une clé unique, une paire de valeurs dans le dictionnaire. J'ai essayé d'utiliser les classes csv.DictReader
et csv.DictWriter
, mais je ne savais que créer un nouveau dictionnaire pour chaque ligne. Je veux un dictionnaire. Voici le code que j'essaye d'utiliser:
import csv
with open('coors.csv', mode='r') as infile:
reader = csv.reader(infile)
with open('coors_new.csv', mode='w') as outfile:
writer = csv.writer(outfile)
for rows in reader:
k = rows[0]
v = rows[1]
mydict = {k:v for k, v in rows}
print(mydict)
Lorsque je lance le code ci-dessus, je reçois une ValueError: too many values to unpack (expected 2)
. Comment créer un dictionnaire à partir d'un fichier csv? Merci.
Je crois que la syntaxe que vous recherchiez est la suivante:
with open('coors.csv', mode='r') as infile:
reader = csv.reader(infile)
with open('coors_new.csv', mode='w') as outfile:
writer = csv.writer(outfile)
mydict = {rows[0]:rows[1] for rows in reader}
Alternativement, pour python <= 2.7.1, vous voulez:
mydict = dict((rows[0],rows[1]) for rows in reader)
Ouvrez le fichier en appelant open puis csv.DictReader
.
input_file = csv.DictReader(open("coors.csv"))
Vous pouvez parcourir les lignes de l’objet de lecture de dict du fichier csv en effectuant une itération sur input_file.
for row in input_file:
print row
OU Pour accéder à la première ligne uniquement
dictobj = csv.DictReader(open('coors.csv')).next()
import csv
reader = csv.reader(open('filename.csv', 'r'))
d = {}
for row in reader:
k, v = row
d[k] = v
Vous devez simplement convertir csv.reader to dict:
~ >> cat > 1.csv
key1, value1
key2, value2
key2, value22
key3, value3
~ >> cat > d.py
import csv
with open('1.csv') as f:
d = dict(filter(None, csv.reader(f)))
print(d)
~ >> python d.py
{'key3': ' value3', 'key2': ' value22', 'key1': ' value1'}
Vous pouvez également utiliser numpy pour cela.
from numpy import loadtxt
key_value = loadtxt("filename.csv", delimiter=",")
mydict = { k:v for k,v in key_value }
Ce n'est pas élégant, mais une solution à une ligne utilisant des pandas.
import pandas as pd
pd.read_csv('coors.csv', header=None, index_col=0, squeeze=True).to_dict()
Si vous souhaitez spécifier dtype pour votre index (vous ne pouvez pas le spécifier dans read_csv si vous utilisez l'argument index_col à cause d'un bug ):
import pandas as pd
pd.read_csv('coors.csv', header=None, dtype={0: str}).set_index(0).squeeze().to_dict()
Je suggère d'ajouter if rows
au cas où il y aurait une ligne vide à la fin du fichier.
import csv
with open('coors.csv', mode='r') as infile:
reader = csv.reader(infile)
with open('coors_new.csv', mode='w') as outfile:
writer = csv.writer(outfile)
mydict = dict(row[:2] for row in reader if row)
Si vous êtes d'accord avec l'utilisation du package numpy, vous pouvez effectuer les opérations suivantes:
import numpy as np
lines = np.genfromtxt("coors.csv", delimiter=",", dtype=None)
my_dict = dict()
for i in range(len(lines)):
my_dict[lines[i][0]] = lines[i][1]
Vous pouvez utiliser ça, c'est plutôt cool:
import dataconverters.commas as commas
filename = 'test.csv'
with open(filename) as f:
records, metadata = commas.parse(f)
for row in records:
print 'this is row in dictionary:'+rowenter code here
Solution monocouche
import pandas as pd
dict = {row[0] : row[1] for _, row in pd.read_csv("file.csv").iterrows()}
Essayez d'utiliser un defaultdict
et DictReader
.
import csv
from collections import defaultdict
my_dict = defaultdict(list)
with open('filename.csv', 'r') as csv_file:
csv_reader = csv.DictReader(csv_file)
for line in csv_reader:
for key, value in line.items():
my_dict[key].append(value)
Il retourne:
{'key1':[value_1, value_2, value_3], 'key2': [value_a, value_b, value_c], 'Key3':[value_x, Value_y, Value_z]}
Pour les fichiers csv simples, tels que les suivants
id,col1,col2,col3
row1,r1c1,r1c2,r1c3
row2,r2c1,r2c2,r2c3
row3,r3c1,r3c2,r3c3
row4,r4c1,r4c2,r4c3
Vous pouvez le convertir en un dictionnaire Python en utilisant uniquement les fonctions intégrées.
with open(csv_file) as f:
csv_list = [[val.strip() for val in r.split(",")] for r in f.readlines()]
(_, *header), *data = csv_list
csv_dict = {}
for row in data:
key, *values = row
csv_dict[key] = {key: value for key, value in Zip(header, values)}
Cela devrait donner le dictionnaire suivant
{'row1': {'col1': 'r1c1', 'col2': 'r1c2', 'col3': 'r1c3'},
'row2': {'col1': 'r2c1', 'col2': 'r2c2', 'col3': 'r2c3'},
'row3': {'col1': 'r3c1', 'col2': 'r3c2', 'col3': 'r3c3'},
'row4': {'col1': 'r4c1', 'col2': 'r4c2', 'col3': 'r4c3'}}
Remarque: Les dictionnaires Python ont des clés uniques. Par conséquent, si votre fichier csv contient des doublons ids
, vous devez ajouter chaque ligne à une liste.
for row in data:
key, *values = row
if key not in csv_dict:
csv_dict[key] = []
csv_dict[key].append({key: value for key, value in Zip(header, values)})
De nombreuses solutions ont été publiées et j'aimerais contribuer avec la mienne, qui fonctionne pour un nombre différent de colonnes dans le fichier CSV. Il crée un dictionnaire avec une clé par colonne et la valeur de chaque clé est une liste avec les éléments de cette colonne.
input_file = csv.DictReader(open(path_to_csv_file))
csv_dict = {elem: [] for elem in input_file.fieldnames}
for row in input_file:
for key in csv_dict.keys():
csv_dict[key].append(row[key])