Написание словаря в 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 ответов:
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