Написание словаря в csv-файл с одной строкой для каждого "ключ: значение"


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

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

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

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

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

7 60

7 ответов:

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

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

чтобы прочитать его обратно:

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

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

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

with open('my_file.csv', 'w') as f:
    [f.write('{0},{1}\n'.format(key, value)) for key, value in my_dict.items()]

просто чтобы дать возможность, написание словаря в 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 метод параметр header имеет значение False только для того, чтобы иметь только элементы справочника без раздражающих строк. Вы всегда можете установить имена столбцов и индексов внутри метод to_csv.

ваш вывод будет выглядеть так:

key1,a
key2,b
key3,c

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

outfile = open( 'dict.txt', 'w' )
for key, value in sorted( mydict.items() ):
    outfile.write( str(key) + '\t' + str(value) + '\n' )

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

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

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

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

Я лично всегда находил модуль 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

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