Mam listę słowników, która wygląda mniej więcej tak:
toCSV = [{'name':'bob','age':25,'weight':200},{'name':'jim','age':31,'weight':180}]
Co powinienem zrobić, aby przekonwertować to na plik CSV, który wygląda mniej więcej tak:
name,age,weight
bob,25,200
jim,31,180
python
csv
dictionary
data-conversion
backus
źródło
źródło
Odpowiedzi:
EDYCJA: Moje poprzednie rozwiązanie nie obsługuje zamówienia. Jak zauważył Wilduck, DictWriter jest tutaj bardziej odpowiedni.
źródło
with open('people.csv', 'wb') as f: ...
dict_writer.writeheader()
zamiastdict_writer.writer.writerow(keys)
open('people.csv', 'w')
set().union(*(d.keys() for d in mylist))
aby uzyskać wszystkie klucze z listy (jeśli masz takie, które nie mają wszystkich kluczy).tak jest, gdy masz jedną listę słowników:
źródło
W Pythonie 3 rzeczy są trochę inne, ale o wiele prostsze i mniej podatne na błędy. Dobrym pomysłem jest poinformowanie CSV, że plik powinien zostać otwarty z
utf8
kodowaniem, ponieważ sprawia, że dane są bardziej przenośne dla innych (zakładając, że nie używasz bardziej restrykcyjnego kodowania, np.latin1
)csv
w Pythonie 3 potrzebny jestnewline=''
parametr, w przeciwnym razie podczas otwierania w programie excel / opencalc otrzymasz puste wiersze w pliku CSV.Alternatywnie: wolę używać programu obsługi csv w
pandas
module. Uważam, że jest bardziej tolerancyjny na problemy z kodowaniem, a pandy automatycznie konwertują liczby ciągów w plikach CSV na właściwy typ (int, float itp.) Podczas ładowania pliku.Uwaga:
utf8
w python3, a także ustalą nagłówki.dataframe.to_dict('records')
csv
modułem waniliowym , musisz go podaćOrderedDict
lub pojawią się w losowej kolejności (jeśli pracujesz w pythonie <3.5). Zobacz: Zachowywanie kolejności kolumn w Python Pandas DataFrame, aby uzyskać więcej informacji.źródło
Ponieważ @User i @BiXiC poprosili o pomoc z UTF-8 tutaj wariant rozwiązania autorstwa @Matthew. (Nie mogę komentować, więc odpowiadam.)
źródło
Byłby to najprostszy sposób zapisania danych do pliku .csv
źródło
Oto inne, bardziej ogólne rozwiązanie, przy założeniu, że nie masz listy wierszy (być może nie mieszczą się w pamięci) lub kopii nagłówków (być może
write_csv
funkcja jest ogólna):Uwaga : użyty tutaj konstruktor OrderedDict zachowuje tylko kolejność w Pythonie> 3.4. Jeśli zamówienie jest ważne, skorzystaj z
OrderedDict([('name', 'bob'),('age',25)])
formularza.źródło
źródło