2014-05-12 14 views
9

Mam problem z pisaniem słownika list do pliku .csv.Zapisywanie słownika list do pliku CSV

To jest jak mój słownik wygląda następująco:

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

Chcę plik .csv wyglądać:

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

Początkowo piszę nagłówek:

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

Jak dotąd tak dobrze ... Jednak moim problemem jest to, że nie wiem, w jaki sposób mogę przypisać jedną listę do odpowiedniej kolumny. np .:

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

losowo wypełni kolumny. Innym problemem jest to, że muszę ręcznie wypełniać klucze i nie mogę użyć go do innego słownika z 4 kluczami.

+0

Co rozumiesz przez "losowe wypełnienie kolumn"? –

+2

@RobWatts Myślę, że OP oznacza, że ​​ponieważ 'dict's są nieuporządkowane, funkcja' keys() 'wypisze je" losowo ", np. Klawisz 3, klucz 1, klucz 2 – CoryKramer

+0

Nawiasem mówiąc, nie powinieneś używać 'dict' jako nazwy zmiennej. –

Odpowiedz

21

Jeśli nie dbają o porządek w swoich kolumnach (od słowniki są nieuporządkowane), można po prostu użyć 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())) 

Wynik:

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

Jeśli nie obchodzi zamówienie, musisz posortować klucze:

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])) 

Wynik:

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

jak możemy zmienić wiersze na kolumny tutaj key1 \ tab 7 \ tab 4 \ tab 1 –

+1

Jeśli spojrzysz na pytanie, użyłem' zip() ', aby przetransponować oryginalne dane. Jeśli wykonasz operację ponownie, zmienisz wiersze na kolumny ponownie. Zauważ, że 'klucz1 - 7 - 4 - 1' prawdopodobnie nie jest tym, czego potrzebujesz ... –

+0

To działa dla mnie, a ja uzyskuję dane wyjściowe, które chcę, ale nadal generuje on typError" argument zip # 1 musi obsługiwać iterację ". Jakiś powód tego? – jwoe

0
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]) 
1

Biorąc

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

Poniższy kod:

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') 

produkuje csv, który wygląda tak:

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

przewróceniu własne bez csv moduł:

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))