Вопрос по python – Как мне написать словарь Python в CSV-файл? [Дубликат]

90

This question already has an answer here:

Python Dictionary to CSV 4 answers

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

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

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

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

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

Есть идеи?

Можете ли вы принять ответ, чтобы пометить вопрос как решенный? Это помогло бы и другим пользователям. MERose

Ваш Ответ

3   ответа
159

DictWriter.writerows() который ожидает список диктов, а не диктат. Ты хочешьDictWriter.writerow() написать одну строку.

Вы также хотите использоватьDictWriter.writeheader() если вы хотите заголовок для вашего CSV-файла.

Вы также можете проверитьwith statement заоткрытие файлов, Она не только более питонна и удобочитаема, но и закрывает вас даже при возникновении исключений.

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

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
Небольшое дополнение: вы можете легко напечатать подмножество dict, используяcsv.DictWriter(f, ["testing"], extrasaction='ignore')
71

very близко к работе.

Попробуйте использовать обычный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).

@AnuragSharma первый блок кода делает то, что вам нужно.
Если я хочу записать ключи в одном столбце и значения в другом, что я должен делать, я попытался выполнить поиск в документах Python CSV, но, похоже, у него нет функции writecolumn ()
-11

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

@DSM: исправлено.
Откуда вы знаете, что ключи и значения не содержат запятых? Если они это сделают, вы не сможете проанализировать вывод. [Кстати, это даже не будет работать так, как написано: keys - это список, поэтому keys () не будет работать, и он не будет работать, если ключи и значения не похожи на строки.]
Вы действительно не должны препятствовать использованию правильного модуля для работы
Почему бы не использовать модуль, предназначенный для этой цели? Это позволяет легко его расширять позже и очень ясно, что вы хотите сделать. Я не думаю, что это очень хороший совет.
Это уродливый способ получить ключи и значения тоже - если бы вы делали это таким образом (что не очень хорошо), то, по крайней мере, делайте что-то вродеkeys, values = zip(*my_dict.items()).

Похожие вопросы