2017-10-11 2 views
1

Je veux écrire des fichiers de résultats à .csv. J'ai préparé un exemple de test simple.Écrire dictionnaire avec des tableaux numpy à .csv

import numpy as np 
data = {} 
testdata = np.array([1,2,3,4,5]) 

data['set1'] = {'a': testdata, 'b': testdata, 'c': testdata} 
data['set2'] = {'a2': testdata, 'b2': testdata, 'c2': testdata} 
data['set3'] = {'a3': testdata, 'b3': testdata, 'c3': testdata} 

Ce serait génial d'obtenir un fichier de résultat comme celui-ci:

enter image description here

est-il un moyen simple que vous pouvez recomment?

+0

https://docs.python.org/2/library/csv.html#csv.writer Avez-vous essayé d'utiliser le ' csv' module? Essayez quelques exemples, vous devriez être en mesure de comprendre. – sam

Répondre

3

Vous pouvez collecter des en-têtes et des lignes dans des structures de données distinctes, puis utiliser le module csv pour tout écrire sur une feuille Excel. En outre, le dict data doit être converti en OrderedDict pour maintenir l'ordre de la séquence.

SourceCode

import numpy as np 
import csv 
from collections import OrderedDict 
from itertools import chain 


data = {} 

testdata = np.array([1,2,3,4,5]) 
data = OrderedDict(data) 


a = {'a': testdata, 'b': testdata, 'c': testdata} 
b = {'a2': testdata, 'b2': testdata, 'c2': testdata} 
c = {'a3': testdata, 'b3': testdata, 'c3': testdata} 

#covert inner dict to OrderedDict 
data['set1'] = OrderedDict(sorted(a.items(), key=lambda x:x[0])) 
data['set2'] = OrderedDict(sorted(b.items(), key=lambda x:x[0])) 
data['set3'] = OrderedDict(sorted(c.items(), key=lambda x:x[0])) 

#collect second header 
header2 = [data.get(k).keys() for k in data.keys()] 

#get number of repetations for header1 
header1_size = len(header2[0]) 

#get header1 
header1 = sorted((data.keys())*header1_size) 

#flatten list of list of header2 
header2 = list(chain.from_iterable(header2)) 

#get rows from data dict 
rows = zip(*[v2 for k1,v1 in data.items() for k2,v2 in v1.items() ]) 

#write header1,header2 and rows to excel /csv 
with open('csvfile.csv','wb') as ofile:    
    wr = csv.writer(ofile, dialect='excel') 
    wr.writerow(header1) 
    wr.writerow(header2) 
    wr.writerows(rows) 

csvfile
enter image description here