【问题标题】:Python: Cleanest way to write tuples as rows of a DictWriter?Python:将元组编写为 DictWriter 行的最简洁方法?
【发布时间】:2015-09-14 13:58:26
【问题描述】:

给定:

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)]

我正在尝试使用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(),但这似乎有点令人费解。

实现这一点的更简洁/更短的方法是什么?

【问题讨论】:

  • 行从何而来?
  • 对不起,row 将代表我希望从每个 tuple/fieldNames 组合中创建的字典
  • 是的,但它是什么样子的,如果你已经有一个可迭代的可迭代对象,你就不需要 DictWriter
  • @PadraicCunningham 是的,Padraic 好点。这是一个古老的例子,“当你唯一的工具是一把锤子时,你开始把每一个问题都看作是钉子。”在这种情况下,我唯一的工具是 DictWriter,而我以前没有使用过更基本的工具变体。

标签: python python-2.7 dictionary tuples ordereddictionary


【解决方案1】:

如果您的数据未格式化为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

更简单、更快、代码更少。

【讨论】:

    【解决方案2】:

    你可以使用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'}
    

    【讨论】:

    • 我虽然有 zip,但是当我将压缩数据传递给 dict() 时,结果 dict 的顺序确实与字段名的顺序匹配
    猜你喜欢
    • 2010-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多