J'essaye de créer un dictionnaire à partir d'un fichier csv. La première colonne du fichier csv contient des clés uniques et la deuxième colonne contient des valeurs. Chaque ligne du fichier csv représente une paire clé / valeur unique dans le dictionnaire. J'ai essayé d'utiliser les classes csv.DictReader
et csv.DictWriter
, mais je ne pouvais que comprendre comment générer 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 j'exécute le code ci-dessus, j'obtiens un ValueError: too many values to unpack (expected 2)
. Comment créer un dictionnaire à partir d'un fichier csv? Merci.
python
csv
dictionary
list-comprehension
drbunsen
la source
la source
Réponses:
Je pense que la syntaxe que vous recherchiez est la suivante:
Alternativement, pour python <= 2.7.1, vous voulez:
la source
Ouvrez le fichier en appelant open puis
csv.DictReader
.Vous pouvez parcourir les lignes de l'objet lecteur de dict du fichier csv en itérant sur input_file.
OU Pour accéder à la première ligne uniquement
MISE À JOUR Dans les versions de python 3+, ce code changerait un peu:
la source
next(dictobj)
plutôt quedictobj.next()
dans les versions Python 3+.la source
for row in reader: k, v = row
si vous pouvez simplement écrirefor k, v in reader
, par exemple. Et si vous vous attendez à ce que ce lecteur soit un itérable, produisant des éléments à deux éléments, vous pouvez simplement le transmettre directement à dict pour la conversion.d = dict(reader)
est beaucoup plus court et nettement plus rapide sur d'énormes ensembles de données.for row in reader
paradigme ci-dessus , alors cela pourrait (après un développement à long terme) être plus pratique. Je suis d'accord avec vous à court terme, mais méfiez-vous d'une optimisation prématurée.Ce n'est pas une solution élégante mais une ligne utilisant des pandas.
Si vous souhaitez spécifier dtype pour votre index (il ne peut pas être spécifié dans read_csv si vous utilisez l'argument index_col à cause d'un bogue ):
la source
Vous devez simplement convertir csv.reader en dict:
la source
ValueError: dictionary update sequence element #2 has length 3; 2 is required
.filter
appel avecmap(operator.itemgetter(slice(2)), ...)
, donc il ne tirer les deux premiers iterms, ce qui en fait:dict(map(operator.itemgetter(slice(2)), filter(None, csv.reader(f))))
. Si c'est Python 2, assurez-vous de le fairefrom future_builtins import map, filter
, de sorte que ledict
lit un générateur directement, au lieu de produire d'abord plusieurs temporaires inutileslist
).Vous pouvez également utiliser numpy pour cela.
la source
Je suggère d'ajouter
if rows
au cas où il y aurait une ligne vide à la fin du fichierla source
Solution à une doublure
la source
Si vous êtes d'accord avec l'utilisation du package numpy, vous pouvez faire quelque chose comme ceci:
la source
Pour les fichiers csv simples, tels que les suivants
Vous pouvez le convertir en dictionnaire Python en utilisant uniquement des éléments intégrés
Cela devrait donner le dictionnaire suivant
Remarque: les dictionnaires Python ont des clés uniques, donc si votre fichier csv a un doublon,
ids
vous devez ajouter chaque ligne à une liste.la source
set_default
: csv_dict.set_default (clé, []). append ({clé: valeur pour clé, valeur dans zip (en-tête, valeurs)})).append
commande était très utile. J'ai fini par utiliser la même syntaxe dans unrow.update
lors de l'itération et de l'ajout à unDictReader
objet créé à partir d'un fichier CSV.Vous pouvez utiliser ceci, c'est plutôt cool:
la source
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.
la source
avec les pandas, c'est beaucoup plus facile, par exemple. en supposant que vous avez les données suivantes au format CSV et appelons-les
test.txt
/test.csv
(vous savez que CSV est une sorte de fichier texte)utilise maintenant des pandas
pour chaque ligne, ce serait
et c'est tout.
la source
Essayez d'utiliser un
defaultdict
etDictReader
.Il renvoie:
la source