У меня есть словарь:
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()
Но теперь у меня все ключи в одной строке и все значения в следующей строке ..
Когда мне удается записать такой файл, я также хочу прочитать его обратно в новый словарь.
Чтобы объяснить мой код, словарь содержит значения и логические значения из textctrls и флажков (с использованием wxpython). Хочу добавить кнопки «Сохранить настройки» и «Загрузить настройки». Параметры сохранения должны записывать словарь в файл указанным способом (чтобы пользователю было проще редактировать файл csv напрямую), параметры загрузки должны считываться из файла и обновлять textctrls и флажки.
python
csv
dictionary
user1106770
источник
источник
key1, value_a [linebreak] key2, value_b [linebreak] key3, value_c
?repr()
для записи словаря, а затем для оценки строки, когда вы ее читаете. Посмотрите на этот старый пост SO, где обсуждаютсяstr()
vs.repr()
, а также документы .ConfigParser
модульОтветы:
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)
который довольно компактен, но предполагает, что вам не нужно выполнять преобразование типов при чтении
источник
delimiter=':'
при создании писателя и читателя :)with
лучше использовать. Я изменю примеры, чтобы отразить это ...\n
, вы попадете\n
в файл). Если оставить его в покое, сработает «универсальный режим», и новые строки переводятся в значения по умолчанию для текущей операционной системы. Учитывая, что здесь это бесполезно (кроме случаев, когда вы хотите иметь предсказуемые символы новой строки), я удалю его.Чтобы дать возможность, запись словаря в файл 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.
Ваш результат будет выглядеть так:
Если вместо этого вы хотите, чтобы ключи были именами столбцов, просто используйте параметр «orient» по умолчанию, который является «columns», как вы могли бы проверить в ссылках на документацию.
источник
Самый простой способ - игнорировать модуль csv и отформатировать его самостоятельно.
with open('my_file.csv', 'w') as f: [f.write('{0},{1}\n'.format(key, value)) for key, value in my_dict.items()]
источник
key
есть запятая, вам будет плохо.csv.writer(...).writerows(my_dict.items())
.csv
Модуль делает это гораздо больше , чем просто добавить запятые и новую строку.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, ключ_2: значение_2
источник
','.join("%s:%s" % (k,v) for k,v in mydict.items())
- вам обычно лучше перебирать элементы dict, которые дают вам ключи и значения вместе, чем по ключам dict и выполнять поиск значений n.','.join(...)
заботится только о том, чтобы помещать запятые между значениями, без добавления дополнительной запятой.Я лично всегда находил модуль 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
источник
import csv dict = {"Key Header":"Value Header", "key1":"value1", "key2":"value2"} with open("test.csv", "w") as f: writer = csv.writer(f) for i in dict: writer.writerow([i, dict[i]]) f.close()
источник
#code to insert and read dictionary element from csv file import csv n=input("Enter I to insert or S to read : ") if n=="I": m=int(input("Enter the number of data you want to insert: ")) mydict={} list=[] for i in range(m): keys=int(input("Enter id :")) list.append(keys) values=input("Enter Name :") mydict[keys]=values with open('File1.csv',"w") as csvfile: writer = csv.DictWriter(csvfile, fieldnames=list) writer.writeheader() writer.writerow(mydict) print("Data Inserted") else: keys=input("Enter Id to Search :") Id=str(keys) with open('File1.csv',"r") as csvfile: reader = csv.DictReader(csvfile) for row in reader: print(row[Id]) #print(row) to display all data
источник
Вы пробовали добавить "s" на:
w.writerow(mydict)
вот такw.writerows(mydict)
:? Эта проблема случилась со мной, но со списками я использовал единственное, а не множественное число.источник