2015-04-27 3 views
0

У меня есть список словарей, таких как:Написать список значений словаря в файл

values = [{'Name': 'John Doe', 'Age': 26, 'ID': '1279abc'}, 
      {'Name': 'Jane Smith', 'Age': 35, 'ID': 'bca9721'} 
     ] 

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

Name Age ID 
John Doe 26 1279abc 
Jane Smith  35 bca9721 

Однако, я не могу обернуть мою голову вокруг просто печатает значения, так как прямо сейчас я печатаю весь словарь для каждой строки с помощью:

for i in values: 
    f.write(str(i)) 
    f.write("\n") 

Возможно, мне нужно перебирать каждый словарь сейчас? Я видел, как люди использовали что-то вроде:

for i, n in iterable: 
    pass 

Но я этого никогда не понимал. Любой, кто может пролить свет на это?

EDIT:

Представляется, что я мог бы использовать что-то вроде этого, если кто-то имеет более вещий путь (Возможно, кто-то может объяснить "для г, п в interable"?):

for dic in values: 
    for entry in dic: 
     f.write(dic[entry]) 
+0

Можете ли вы гарантировать, что каждый словарь имеет одни и те же ключи? –

+0

Да, ключи извлекаются через клавиши = значения [0] .keys(). – mmenschig

ответ

4

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

from csv import DictWriter 
values = [{'Name': 'John Doe', 'Age': 26, 'ID': '1279abc'}, 
      {'Name': 'Jane Smith', 'Age': 35, 'ID': 'bca9721'}] 
keys = values[0].keys() 
with open("new-file.tsv", "w") as f: 
    dict_writer = DictWriter(f, keys, delimiter="\t") 
    dict_writer.writeheader() 
    for value in values: 
     dict_writer.writerow(value) 
+0

Это отлично работало, однако, открывая файл в Excel (блокнот отлично смотрится), каждая вторая строка является пустой, можете ли вы это объяснить? – mmenschig

+0

Поскольку я нахожусь в Linux, я не могу ручаться за то, что делает Excel с этими данными. Однако я предполагаю, что вы можете импортировать его в excel и указать разделитель как вкладки. – Makoto

+0

Я нашел причину, параметр «lineterminator» помогает. linux использует строку стиля unix, заканчивающуюся «\ r \ n» вместо «\ n». Спасибо за ваше решение! – mmenschig

0
f.write('Name\tAge\tID') 
for value in values: 
    f.write('\t'.join([value.get('Name'), str(value.get('Age')), value.get('ID')])) 
+0

Почему 'value.get ('Name')' вместо 'value ['Name']'? – dbliss

+1

Единственное практическое отличие состоит в том, что 'get()' возвращает 'None', если ключ не существует, а индексирование ключа, который не существует, вызывает трассировку. – TigerhawkT3

+0

'None' уже возвращен по умолчанию в этой ситуации. – TigerhawkT3

0
# assuming your dictionary is in values 
import csv 
with open('out.txt', 'w') as fout: 
    writer = csv.DictWriter(fout, fields=values.keys(). delimiter="\t") 
    writer.writeheader() 
    writer.writerow(values.values()) 
Смежные вопросы