web-dev-qa-db-fra.com

Écrire un dictionnaire de listes dans un fichier CSV

J'ai du mal à écrire un dictionnaire de listes dans un fichier .csv.

Voici à quoi ressemble mon dictionnaire:

dict[key1]=[1,2,3]
dict[key2]=[4,5,6]
dict[key3]=[7,8,9]

Je veux que le fichier .csv ressemble à ceci:

key1  key2  key3
1     4     7  
2     5     8
3     6     9

Au début, j'écris l'en-tête:

outputfile = open (file.csv,'wb')
writefile = csv.writer (outputfile)
writefile.writerow(dict.keys())

Jusqu'ici tout va bien ... Cependant, mon problème est que je ne sais pas comment attribuer une liste à la colonne correspondante. par exemple.:

for i in range(0,len(dict[key1])):
    writefile.writerow([dict[key1][i],dict[key2][i],dict[key3][i])

remplira au hasard les colonnes. Un autre problème est que je dois saisir manuellement les clés et que je ne peux pas l'utiliser pour un autre dictionnaire avec 4 clés.

19
suschi

Si vous ne vous souciez pas de l'ordre de vos colonnes (puisque les dictionnaires ne sont pas ordonnés), vous pouvez simplement utiliser Zip():

d = {"key1": [1,2,3], "key2": [4,5,6], "key3": [7,8,9]}
with open("test.csv", "wb") as outfile:
   writer = csv.writer(outfile)
   writer.writerow(d.keys())
   writer.writerows(Zip(*d.values()))

Résultat:

key3    key2    key1
7       4       1
8       5       2
9       6       3

Si vous vous souciez de l'ordre, vous devez trier les clés:

keys = sorted(d.keys())
with open("test.csv", "wb") as outfile:
   writer = csv.writer(outfile, delimiter = "\t")
   writer.writerow(keys)
   writer.writerows(Zip(*[d[key] for key in keys]))

Résultat:

key1    key2    key3
1       4       7
2       5       8
3       6       9
26
Tim Pietzcker

Donné

dict = {}
dict['key1']=[1,2,3]
dict['key2']=[4,5,6]
dict['key3']=[7,8,9]

Le code suivant:

COL_WIDTH = 6
FMT = "%%-%ds" % COL_WIDTH

keys = sorted(dict.keys())

with open('out.csv', 'w') as csv:
    # Write keys    
    csv.write(''.join([FMT % k for k in keys]) + '\n')

    # Assume all values of dict are equal
    for i in range(len(dict[keys[0]])):
        csv.write(''.join([FMT % dict[k][i] for k in keys]) + '\n')

produit un csv qui ressemble à:

key1  key2  key3
1     4     7
2     5     8
3     6     9
1
jedwards

Rouler soi-même sans le module csv:

d = {'key1' : [1,2,3],
     'key2' : [4,5,6],
     'key3' : [7,8,9]}

column_sequence = sorted(d.keys())
width = 6
fmt = '{{:<{}}}'.format(width)
fmt = fmt*len(column_sequence) + '\n'

output_rows = Zip(*[d[key] for key in column_sequence])

with open('out.txt', 'wb') as f:
    f.write(fmt.format(*column_sequence))
    for row in output_rows:
        f.write(fmt.format(*row))
1
wwii
key_list = my_dict.keys()    
limit = len(my_dict[key_list[0]])    

for index in range(limit):    
  writefile.writerow([my_dict[x][index] for x in key_list])
0
jcfollower

enregistrer:

with open(path, 'a') as csv_file:
    writer = csv.writer(csv_file)
    for key, value in dict_.items():
        writer.writerow([key, ','.join(value)])
csv_file.close()        
print ('saving is complete') 

relire:

with open(csv_path, 'rb') as csv_file:
    reader = csv.reader(csv_file);
    temp_dict = dict(reader);
mydict={k:v.split(',') for k,v in temp_dict.items()}    
csv_file.close()
return mydict 
0
Alireza