2015-06-27 2 views
2

Дано:Python: Самый чистый способ писать кортежи как строки DictWriter?

with open('results.csv', 'wb') as csvfile: 
    fieldnames = ['Name', 'Address', '#Reviews'] 
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames) 
    writer.writeheader() 
    writer.writerow(row) 

И список кортежей, каждый из которых содержит имя, адрес и #reviews например

[('Name2', 'Main St', 2), ('Name2', 'The Hill', 7), ('Name1', 'The Square', 14)] 

Я пытаюсь написать каждый кортеж в виде строки в формате CSV, используя writer.writerow(). Я мог бы создать Dict для каждого кортежа, таким образом:

In [95]: for tup in z: 
    ....:  row = {"Name": tup[0], "Address": tup[1], "#Reviews": tup[2]} 
    ....:  print row 

Но (я) это запутанное и что еще более важно (б) порядок теряется в создании Dict, и порядок не будет совпадать с fieldnames.

Я мог бы использовать OrderedDict(), но снова это кажется немного запутанным.

Что является более аккуратным/более коротким способом достижения этого?

+0

где находится ряд? –

+0

извините, * row * будет представлять собой dict, который я ищу для создания из каждого кортежа/fieldNames combo – Pyderman

+2

да, но как это выглядит, вам не нужен DictWriter, если у вас уже есть итерабельность итераций –

ответ

4

Если данные не отформатированы как dict, почему вы используя DictWriter? Просто используйте нормальный csv.writer:

with open('results.csv', 'wb') as csvfile: 
    fieldnames = ['Name', 'Address', '#Reviews'] 
    writer = csv.writer(csvfile) 
    writer.writerow(fieldnames) 
    writer.writerows(z) # z is a list of all rows to write 

Simpler, быстрее, и гораздо меньше кода.

1

Вы можете использовать zip:

data = [('Name2', 'Main St', 2), ('Name2', 'The Hill', 7), ('Name1', 'The Square', 14)] 
for entry in data: 
    row = dict(zip(fieldnames, entry)) 
    print(row) 

Это создаст соответствующие словари, которые могут быть переданы в csv.DictWriter:

>>> fieldnames = ['Name', 'Address', '#Reviews'] 
>>> for entry in data: 
...  row = dict(zip(fieldnames, entry)) 
...  print(row) 
... 
{'Name': 'Name2', '#Reviews': 2, 'Address': 'Main St'} 
{'Name': 'Name2', '#Reviews': 7, 'Address': 'The Hill'} 
{'Name': 'Name1', '#Reviews': 14, 'Address': 'The Square'} 
+0

У меня был почтовый индекс, но когда я передал данные zipped в * dict() *, порядок полученного dict соответствовал порядку имен полей – Pyderman

Смежные вопросы