Как написать словарь Python в файл csv?

У меня есть то, что, по моему мнению, должно быть очень простой задачей, которую я не могу решить.

Как написать словарь Python в файл csv? Все, что я хочу, - это записать словарные ключи в верхнюю строку файла и значения ключа во вторую строку.

Самое близкое, что я пришел, следующее (что я получил от кого-то другого):

f = open('mycsvfile.csv','wb')
w = csv.DictWriter(f,my_dict.keys())
w.writerows(my_dict)
f.close()

Проблема в том, что приведенный выше код, кажется, только пишет ключи к первой строке и что он. Я не получаю значения, записанные во вторую строку.

Любые идеи?

Ответ 1

Вы используете DictWriter.writerows(), который ожидает список dicts, а не dict. Вы хотите, чтобы DictWriter.writerow() записывал одну строку.

Вы также захотите использовать DictWriter.writeheader(), если вам нужен заголовок для вашего csv файла.

Вы также можете проверить инструкцию with для открытия файлов. Это не только больше pythonic и readable, но и ручки закрываются для вас, даже если исключения происходят.

Пример с этими изменениями:

import csv

my_dict = {"test": 1, "testing": 2}

with open('mycsvfile.csv', 'wb') as f:  # Just use 'w' mode in 3.x
    w = csv.DictWriter(f, my_dict.keys())
    w.writeheader()
    w.writerow(my_dict)

Что производит:

test,testing
1,2

Ответ 2

Ваш код был очень близок к работе.

Попробуйте использовать обычный csv.writer, а не DictWriter. Последний в основном используется для написания списка словарей.

Вот код, который записывает каждую пару ключ/значение в отдельной строке:

import csv

somedict = dict(raymond='red', rachel='blue', matthew='green')
with open('mycsvfile.csv','wb') as f:
    w = csv.writer(f)
    w.writerows(somedict.items())

Если вместо этого вы хотите, чтобы все клавиши в одной строке и все значения на следующем, это тоже легко:

with open('mycsvfile.csv','wb') as f:
    w = csv.writer(f)
    w.writerow(somedict.keys())
    w.writerow(somedict.values())

Pro tip. При разработке кода, как это, установите для автора w = csv.writer(sys.stderr), чтобы вы могли более легко увидеть, что генерируется. Когда логика будет усовершенствована, вернитесь к w = csv.writer(f).

Ответ 3

Зачем использовать csv для этой простой задачи?

keys,values=zip(*my_dict.items())
print >>f, ", ".join(keys)
print >>f, ", ".join(values)
f.close()

Я использую python двумя способами:

1. As a proper language where I want all software engineering principles to hold in my code.
2. As a scripting language, where I want to just get something done and the code I write for this is not meant for reuse.

Мой ответ полезен только для 2-й цели. А также считает боль помнить все эти модули и их индивидуальные функции: P