2015-12-15 26 views
5

Piuttosto nuovo per Python, e la documentazione per i file CSV è un po 'confusa.Lettura/Scrittura di un dizionario in file csv in python

Ho un dizionario che è simile al seguente:

key1: (valore1, valore2)

key2: (valore1, valore2)

key3: (valore1, valore2) .. ..

Vorrei scrivere questi in un file csv nel formato in cui ogni riga contiene la chiave, seguita dai due valori.

Vorrei anche poterli rileggere in un dizionario dal file in un secondo momento.

+1

Leggi questo https://docs.python.org/3/tutorial/, prova a risolverlo da solo, vieni qui (se hai problemi) a porre domande specifiche. –

+2

Perché un CSV? Se vuoi salvare e caricare puoi guardare cose come 'pickle' o' json'. Entrambi hanno metodi di scarico e caricamento piuttosto solidi, 'json' outbut essendo leggibili dall'utente. –

+0

Userò questi valori in Excel per eseguire alcuni calcoli. Ma verrà utilizzato su più file in modo da poter mantenere un totale parziale. – SlightlyCultured

risposta

4

non trovo abbastanza motivi per utilizzare Panda qui per un tempo relativamente semplice problema. Nota anche per OP, se vuoi memorizzare il valore nel file e leggerlo indietro vai per JSON invece di CSV. L'esportazione in CSV sarà utile per interagire con altre persone (potenzialmente utenti di Excel).

Ecco come mi conservarlo in CSV

value1 = 'one' 
value2 = 'two' 
d = { 
     'key1': (value1, value2), 
     'key2': (value1, value2), 
     'key3': (value1, value2) 
    } 
CSV ="\n".join([k+','+",".join(v) for k,v in d.items()]) 
print CSV #You can store this string variable to file as you wish 
# with open("filename.csv", "w") as file: 
    # file.write(CSV) 

Questo codice spiega ciò che accade all'interno della lista comrpehension.

CSV = "" 
for k,v in d.items(): 
    line = "{},{}\n".format(k, ",".join(v)) 
    CSV+=line 
print CSV 
+0

Questo sembra più qualcosa che posso comprendere. Quindi, dove hai scritto "per k, v in d.items()", il parametro v (assumendo l'etichetta per il valore) rileva automaticamente che ci sono 2 valori (una tupla) lì? i.e questo tasto di stampa, valore1, valore2? – SlightlyCultured

+0

Sì, si assume che 'v' sia una tupla,' ",". Join "significa unire quei varialbes con una virgola. Ho elaborato la comprensione della lista con un ciclo for. Spero che sarà più facile e più leggibile. – nehemiah

6

Consiglio vivamente il numero Pandas per questo.

Convertire a Pandas dataframe:

import pandas as pd 

d = { 
    'a': (1, 101), 
    'b': (2, 202), 
    'c': (3, 303) 
} 
df = pd.DataFrame.from_dict(d, orient="index") 

Creare un file CSV:

df.to_csv("data.csv") 

Leggere il file CSV indietro come un dataframe:

df = pd.read_csv("data.csv", index_col=0) 

Convertire il dataframe indietro al formato dizionario originale:

d = df.to_dict("split") 
d = dict(zip(d["index"], d["data"])) 

EDIT: Grazie al Colonnello Beauvel per avermi ricordato che è possibile passare il nome del file direttamente alle funzioni di Pandas.

EDIT2: Dal momento che si parla che il vostro obiettivo di utilizzare il file di output in Excel, Panda to_excel() e read_excel() potrebbe essere più utile a voi dato che meglio conservano il contenuto tra conversioni. Inoltre, è possibile saltare del tutto Excel e utilizzare standard Python scientific stack.

+2

il modo migliore per usare i panda è to_csv, no bisogno di un comando aperto, cf la mia risposta. –

+0

Non voglio sembrare pignolo, ma qualcuno sa come farlo usando solo python nudo? Non voglio davvero usare altri pacchetti come principiante di Python. – SlightlyCultured

+0

Se stai cercando qualcosa di più minimale in termini di dipendenze, la risposta di itsneo è probabilmente ciò che stai cercando. –

3

avrei usato i panda, può essere fatto in una sola riga:

import pandas as pd 

dic = {'key1':['v1','v2'], 'key2':['vv','gg']} 

pd.DataFrame(dic).T.reset_index().to_csv('myfile.csv', header=False, index=False)