У python 3 речі трохи відрізняються, але простіше і менш схильні до помилок. Непогано сказати CSV, що ваш файл повинен бути відкритий utf8кодуванням, оскільки це робить дані більш портативними для інших (якщо ви не використовуєте більш обмежувальне кодування, як-от latin1)
import csv
toCSV = [{'name':'bob','age':25,'weight':200},
{'name':'jim','age':31,'weight':180}]
with open('people.csv', 'w', encoding='utf8', newline='') as output_file:
fc = csv.DictWriter(output_file,
fieldnames=toCSV[0].keys(),
)
fc.writeheader()
fc.writerows(toCSV)
- Зауважте, що
csvв python 3 потрібен newline=''параметр, інакше ви отримуєте порожні рядки у своєму CSV при відкритті в excel / opencalc.
Як варіант: я вважаю за краще використовувати обробник csv в pandasмодулі. Я вважаю, що толерантніше до питань кодування, і панди автоматично перетворюють номери рядків у CSV-файлах у правильний тип (int, float тощо) під час завантаження файлу.
import pandas
dataframe = pandas.read_csv(filepath)
list_of_dictionaries = dataframe.to_dict('records')
dataframe.to_csv(filepath)
Примітка:
- pandas подбає про те, щоб відкрити файл для вас, якщо ви дасте йому шлях, і за замовчуванням буде
utf8в python3, а також з'ясуємо заголовки.
- фрейм даних не є такою ж структурою, як те, що дає CSV, тому ви додаєте один рядок при завантаженні, щоб отримати те саме:
dataframe.to_dict('records')
- Панди також значно полегшують порядок стовпців у вашому файлі csv. За замовчуванням вони в алфавітному порядку, але ви можете вказати порядок стовпців. За допомогою
csvмодуля ванілі вам потрібно подати його OrderedDictабо вони з’являться у випадковому порядку (якщо вони працюють в python <3.5). Дивіться: Збереження порядку стовпців у Python Pandas DataFrame для отримання додаткової інформації.