2011-11-30 13 views
20

Napisałem kod do odczytu CSV do słownika Pythona, który działa dobrze. Próbuję przywrócić słownik do pliku CSV. Napisałem:Python Dictionary to CSV

import csv 

itemDict={} 

listReader = csv.reader(open('/Users/broberts/Desktop/Sum_CSP1.csv','rU'), delimiter = ',', quotechar='|') 

for row in listReader: 
    fID = row[0] 
    fClassRange = row[1] 
    fArea = row[2] 

    if itemDict.has_key(fID): 
     itemDict[fID][fClassRange]=fArea 
    else: 
     itemDict[fID] = {'5.0 to 5.25':'','5.25 to 5.5':'','5.5 to 5.75':'','5.75 to 6.0':'','6.0 to 6.25':'','6.25 to 6.5':'','6.5 to 6.75':'','6.75 to 7.0':'','7.0 to 7.25':'','7.25 to 7.5':'','7.5 to 7.75':'','7.75 to 8.0':'','8.0 to 8.25':'',} 
     itemDict[fID][fClassRange]=fArea 

listWriter = csv.writer(open('/Users/broberts/Desktop/Sum_CSP1_output.csv', 'wb'), delimiter=',', quotechar='|', quoting=csv.QUOTE_MINIMAL) 

for a in itemDict: 
    print a 
    listWriter.writerow(a) 

W ostatnim bloku, listWriter nie zapisuje niczego w CSV, mimo że wypisze a. Uważam, że ma to coś wspólnego z nieumorzonym słownikiem. Naprawdę muszę napisać fID i każdy z kluczy powiązanych z każdym fID (fClassRange np. "5.0 do 5.25"), a następnie wartość fArea powiązana z każdym fClassRange do CSV, ale nie dostałem nawet tak daleko w mój kod, ponieważ nie mogę wymyślić, jak napisać nawet FID.

Przyjrzałem się używaniu DictWriter, ale nie mogę się dowiedzieć, jak określić, jakie są wymagane nazwy fieldnames.

+0

musiał polecić Kenneth Reitz za [tablib] (http: // docs.python-tablib.org/en/latest/). Robi więcej niż to, czego szukałeś tutaj, więc nie jest to bezpośrednia odpowiedź, po prostu chcesz polecić tę bibliotekę innym. Ma świetny, łatwy w użyciu interfejs API i możesz serializować do csv, tsv, json, yaml i xlsx bez wysiłku. – hangtwenty

Odpowiedz

18

Domyślny program piszący oczekuje listy, dlatego nie będzie działać. Aby korzystać z dictwriter, wystarczy zmienić linię listwriter = do tego:

listWriter = csv.DictWriter(
    open('/Users/broberts/Desktop/Sum_CSP1_output.csv', 'wb'), 
    fieldnames=itemDict[itemDict.keys()[0]].keys(), 
    delimiter=',', 
    quotechar='|', 
    quoting=csv.QUOTE_MINIMAL 
) 

Albo można po prostu ustawić fieldnames być fieldnames=['arbitrary','list','of','keys'] jeśli wiesz, co pola mają być.

+0

Wow, dzięki! Ale teraz otrzymuję tę wiadomość: ValueError: dict zawiera pola nie w nazwach pól: 4, 6, 3, 3, 9 – bojo

+0

@bojo Whoops! Robisz dyktowanie dykt. Aby uzyskać poprawne nazwy pól, potrzebujesz * nazw słowników wewnętrznych *. Ponadto każdy słownik musi mieć te same nazwy pól. Albo musisz użyć opcji DictWriter dla niepoprawnych nazw pól. Zaktualizowałem linię, aby użyć właściwego słownika do uzyskania nazw pól. –

+0

Przykro mi Spencer, wciąż otrzymuję tę samą wiadomość ValueError. – bojo

1

Dla potomności:

Należy użyć iteritems() iteracyjne nad słownika, więc ostatnia część staje

for name, values in itemDict.iteritems(): 
    print values 
    listWriter.writerow(values) 
1

To co mogę używać, jego proste i działa dobrze dla mnie. gdy masz tylko jeden słownik, użyj tego

my_dict = {"tester": 1, "testers": 2} 
with open('mycsvfile.csv', 'wb') as f: 
    w = csv.DictWriter(f, my_dict.keys()) 
    w.writerow(dict((fn,fn) for fn in my_dict.keys())) 
    w.writerow(my_dict) 

$ cat mycsvfile.csv 
testers,tester 
2,1 

Gdy masz listę słowników, jak to, co można uzyskać z zapytaniami SQL, robisz tak.

my_dict = ({"tester": 1, "testers": 2},{"tester": 14, "testers": 28}) 
with open('mycsvfile.csv', 'wb') as f: 
    w = csv.DictWriter(f, my_dict[0].keys()) 
    w.writerow(dict((fn,fn) for fn in my_dict[0].keys())) 
    w.writerows(my_dict) 

cat mycsvfile.csv 
testers,tester 
2,1 
28,14 
1

One-liner do konwersji listę dicts do pliku CSV, używając pandy:

import pandas as pd 

mydict = [{"col1": 1000, "col2": 2000}, {"col1": 3000, "col2": 4000}] 

pd.DataFrame(mydict).to_csv('out.csv', index=False) 

Rezultaty:

col1,col2 
1000,2000 
3000,4000