Mam słownik:
mydict = {key1: value_a, key2: value_b, key3: value_c}
Chcę zapisać dane do pliku dict.csv, w tym stylu:
key1: value_a
key2: value_b
key3: value_c
Napisałem:
import csv
f = open('dict.csv','wb')
w = csv.DictWriter(f,mydict.keys())
w.writerow(mydict)
f.close()
Ale teraz mam wszystkie klucze w jednym wierszu i wszystkie wartości w następnym.
Kiedy uda mi się napisać taki plik, chcę również przeczytać go z powrotem do nowego słownika.
Aby wyjaśnić mój kod, słownik zawiera wartości i boole z textctrls i pól wyboru (używając wxpython). Chcę dodać przyciski „Zapisz ustawienia” i „Wczytaj ustawienia”. Zapis ustawień powinien zapisać słownik do pliku w wymieniony sposób (aby ułatwić użytkownikowi bezpośrednią edycję pliku csv), załadować ustawienia należy odczytać z pliku i zaktualizować textctrls i checkboxy.
python
csv
dictionary
user1106770
źródło
źródło
key1, value_a [linebreak] key2, value_b [linebreak] key3, value_c
?repr()
do wypisania dyktowania, a następnie oceny ciągu, gdy go czytasz. Spójrz na ten stary post SO, aby zapoznać się z dyskusjami na tematstr()
vs.repr()
, a także dokumentacją .ConfigParser
modułOdpowiedzi:
DictWriter
Nie działa zgodnie z oczekiwaniami.with open('dict.csv', 'w') as csv_file: writer = csv.writer(csv_file) for key, value in mydict.items(): writer.writerow([key, value])
Aby to przeczytać:
with open('dict.csv') as csv_file: reader = csv.reader(csv_file) mydict = dict(reader)
co jest dość zwarte, ale zakłada, że nie musisz wykonywać żadnej konwersji typów podczas czytania
źródło
delimiter=':'
podczas tworzenia pisarza i czytelnika :)with
byłoby lepsze. Zmienię przykłady, aby to odzwierciedlić ...\n
, dostaniesz się\n
do pliku). Jeśli pozostawisz go samemu, włącza się „tryb uniwersalny” i znaki nowej linii są tłumaczone na domyślne dla bieżącego systemu operacyjnego. Biorąc pod uwagę, że nie jest to naprawdę przydatne (z wyjątkiem sytuacji, gdy chcesz mieć przewidywalne znaki nowej linii), usunę je.Aby dać opcję, zapisanie słownika do pliku csv może być również wykonane za pomocą pakietu pandas. W podanym przykładzie mogłoby to wyglądać mniej więcej tak:
mydict = {'key1': 'a', 'key2': 'b', 'key3': 'c'}
import pandas as pd (pd.DataFrame.from_dict(data=mydict, orient='index') .to_csv('dict_file.csv', header=False))
Najważniejszą rzeczą do wzięcia pod uwagę jest ustawienie parametru „orient” na „index” w metodzie from_dict . Dzięki temu możesz zdecydować, czy chcesz zapisywać każdy klucz słownika w nowym wierszu.
Dodatkowo w metodzie to_csv parametr nagłówka jest ustawiony na False, aby mieć tylko elementy słownika bez irytujących wierszy. Zawsze możesz ustawić nazwy kolumn i indeksów wewnątrz metody to_csv.
Twój wynik wyglądałby następująco:
Jeśli zamiast tego chcesz, aby klucze były nazwami kolumn, po prostu użyj domyślnego parametru „orient”, czyli „kolumny”, co można sprawdzić w linkach do dokumentacji.
źródło
Najłatwiej jest zignorować moduł csv i samodzielnie go sformatować.
with open('my_file.csv', 'w') as f: [f.write('{0},{1}\n'.format(key, value)) for key, value in my_dict.items()]
źródło
key
przecinek, będziesz się źle bawić.csv.writer(...).writerows(my_dict.items())
.csv
Moduł ma o wiele więcej niż tylko dodać przecinki i znaki nowej linii.outfile = open( 'dict.txt', 'w' ) for key, value in sorted( mydict.items() ): outfile.write( str(key) + '\t' + str(value) + '\n' )
źródło
Czy możesz po prostu zrobić:
for key in mydict.keys(): f.write(str(key) + ":" + str(mydict[key]) + ",");
Abyś mógł
klucz_1: wartość_1, klucz_2: wartość_2
źródło
','.join("%s:%s" % (k,v) for k,v in mydict.items())
- zwykle lepiej jest iterować po elementach dykta, które dają klucze i wartości razem, niż po kluczach dyktu i wyszukiwać wartości „n”.','.join(...)
dba o umieszczanie tylko przecinków między wartościami, bez dodawania dodatkowego końcowego przecinka.Osobiście zawsze uważałem moduł csv za irytujący. Spodziewam się, że ktoś inny pokaże ci, jak to zręcznie zrobić, ale moje szybkie i brudne rozwiązanie to:
with open('dict.csv', 'w') as f: # This creates the file object for the context # below it and closes the file automatically l = [] for k, v in mydict.iteritems(): # Iterate over items returning key, value tuples l.append('%s: %s' % (str(k), str(v))) # Build a nice list of strings f.write(', '.join(l)) # Join that list of strings and write out
Jeśli jednak chcesz go ponownie przeczytać, musisz wykonać irytującą analizę, zwłaszcza jeśli wszystko jest w jednym wierszu. Oto przykład wykorzystujący proponowany format pliku.
with open('dict.csv', 'r') as f: # Again temporary file for reading d = {} l = f.read().split(',') # Split using commas for i in l: values = i.split(': ') # Split using ': ' d[values[0]] = values[1] # Any type conversion will need to happen here
źródło
import csv dict = {"Key Header":"Value Header", "key1":"value1", "key2":"value2"} with open("test.csv", "w") as f: writer = csv.writer(f) for i in dict: writer.writerow([i, dict[i]]) f.close()
źródło
#code to insert and read dictionary element from csv file import csv n=input("Enter I to insert or S to read : ") if n=="I": m=int(input("Enter the number of data you want to insert: ")) mydict={} list=[] for i in range(m): keys=int(input("Enter id :")) list.append(keys) values=input("Enter Name :") mydict[keys]=values with open('File1.csv',"w") as csvfile: writer = csv.DictWriter(csvfile, fieldnames=list) writer.writeheader() writer.writerow(mydict) print("Data Inserted") else: keys=input("Enter Id to Search :") Id=str(keys) with open('File1.csv',"r") as csvfile: reader = csv.DictReader(csvfile) for row in reader: print(row[Id]) #print(row) to display all data
źródło
Czy próbowałeś dodać „s” na: w
w.writerow(mydict)
ten sposóbw.writerows(mydict)
:? Ten problem mi się przydarzył, ale w przypadku list użyłem liczby pojedynczej zamiast liczby mnogiej.źródło