Запись словаря в CSV-файл с одной строкой для каждого «ключ: значение» - PullRequest
72 голосов
/ 31 декабря 2011

У меня есть словарь:

mydict = {key1: value_a, key2: value_b, key3: value_c}

Я хочу записать данные в файл dict.csv, в этом стиле:

key1: value_a
key2: value_b
key3: value_c

Я написал:

import csv
f = open('dict.csv','wb')
w = csv.DictWriter(f,mydict.keys())
w.writerow(mydict)
f.close()

Но теперь у меня есть все ключи в одной строке и все значения в следующей строке ..

Когда мне удается написать такой файл, я тоже хочучтобы прочитать его обратно в новый словарь.

Просто, чтобы объяснить мой код, словарь содержит значения и bool из textctrls и флажков (используя wxpython).Я хочу добавить кнопки «Сохранить настройки» и «Загрузить настройки».При сохранении настроек следует записать словарь в файл указанным способом (чтобы пользователю было проще редактировать csv-файл напрямую), загрузить настройки должны прочитать файл и обновить текстовые поля и флажки.

Ответы [ 7 ]

151 голосов
/ 31 декабря 2011

DictWriter не работает так, как вы ожидаете.

with open('dict.csv', 'w') as csv_file:
    writer = csv.writer(csv_file)
    for key, value in mydict.items():
       writer.writerow([key, value])

Чтобы прочитать это обратно:

with open('dict.csv') as csv_file:
    reader = csv.reader(csv_file)
    mydict = dict(reader)

, что довольно компактно, но предполагает, что вам не нужно выполнять преобразование типов при чтении

12 голосов
/ 03 августа 2017

Просто чтобы дать возможность, запись словаря в csv-файл также может быть сделана с пакетом pandas.В приведенном примере это может выглядеть примерно так:

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))

Главное, что необходимо учитывать, - это установить для параметра 'orient' значение 'index' внутри from_dict метод.Это позволяет вам выбрать, хотите ли вы записать каждый ключ словаря в новую строку.

Дополнительно, внутри метода to_csv параметр заголовка имеет значение False, чтобы иметь только элементы словаря без раздражающих строк.Вы всегда можете установить имена столбцов и индексов внутри метода to_csv.

Ваш вывод будет выглядеть следующим образом:

key1,a
key2,b
key3,c

Если вместо этого вы хотите, чтобы ключи были именами столбцов, просто используйтепараметр по умолчанию 'orient', который является 'columns', как вы могли проверить в ссылках документации.

12 голосов
/ 02 ноября 2013

Самый простой способ - игнорировать модуль csv и отформатировать его самостоятельно.

with open('my_file.csv', 'w') as f:
    [f.write('{0},{1}\n'.format(key, value)) for key, value in my_dict.items()]
4 голосов
/ 25 сентября 2013
outfile = open( 'dict.txt', 'w' )
for key, value in sorted( mydict.items() ):
    outfile.write( str(key) + '\t' + str(value) + '\n' )
2 голосов
/ 31 декабря 2011

Можете ли вы просто сделать:

for key in mydict.keys():
    f.write(str(key) + ":" + str(mydict[key]) + ",");

Так что вы можете иметь

ключ_1: значение_1, ключ_2: значение_2

1 голос
/ 31 декабря 2011

Лично я всегда находил модуль csv раздражающим.Я ожидаю, что кто-то еще покажет вам, как сделать это с умом, но мое быстрое и грязное решение:

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

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

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
0 голосов
/ 14 сентября 2018

Я новичок, также опоздал на эти комментарии, хаха, но вы пытались добавить "s" на: w.writerow (mydict), например: w.writerows (mydict), эта проблема произошла с меня, но со списками, я использовал единственное число вместо множественного числа. Pops! было исправлено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...