Python:将元组写成 DictWriter 的行的最简洁方法?
Python: Cleanest way to write tuples as rows of a DictWriter?
鉴于:
with open('results.csv', 'wb') as csvfile:
fieldnames = ['Name', 'Address', '#Reviews']
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
writer.writerow(row)
还有一个元组列表,每个元组都包含姓名、地址和#review,例如
[('Name2', 'Main St', 2), ('Name2', 'The Hill', 7), ('Name1', 'The Square', 14)]
我正在尝试使用 writer.writerow()
将每个元组写成 csv 中的一行。我可以为每个元组创建一个字典,因此:
In [95]: for tup in z:
....: row = {"Name": tup[0], "Address": tup[1], "#Reviews": tup[2]}
....: print row
但是 (i) 它很复杂,更重要的是 (ii) 顺序在 dict 创建中丢失,顺序将与 fieldnames
的顺序不匹配。
我可以使用 OrderedDict()
,但这又显得有点令人费解。
实现此目标的 neater/shorter 方法是什么?
您可以使用 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'}
如果您的数据未被格式化为 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
更简单、更快且代码更少。
鉴于:
with open('results.csv', 'wb') as csvfile:
fieldnames = ['Name', 'Address', '#Reviews']
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
writer.writerow(row)
还有一个元组列表,每个元组都包含姓名、地址和#review,例如
[('Name2', 'Main St', 2), ('Name2', 'The Hill', 7), ('Name1', 'The Square', 14)]
我正在尝试使用 writer.writerow()
将每个元组写成 csv 中的一行。我可以为每个元组创建一个字典,因此:
In [95]: for tup in z:
....: row = {"Name": tup[0], "Address": tup[1], "#Reviews": tup[2]}
....: print row
但是 (i) 它很复杂,更重要的是 (ii) 顺序在 dict 创建中丢失,顺序将与 fieldnames
的顺序不匹配。
我可以使用 OrderedDict()
,但这又显得有点令人费解。
实现此目标的 neater/shorter 方法是什么?
您可以使用 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'}
如果您的数据未被格式化为 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
更简单、更快且代码更少。