【问题标题】:How to transform dictionaries containing lists to specific rows?如何将包含列表的字典转换为特定行?
【发布时间】:2017-05-04 07:11:34
【问题描述】:

我有类似的 Python 脚本:

for row in file:
    ....
    ....
    ....
    whole_calendar = {}
    whole_calendar['ID'] = id
    whole_calendar['OPEN'] = open_days
    whole_calendar['CLOSED'] = closed_days
    whole_calendar['CHECKED'] = checked_days
    print(whole_calendar)

生成(迭代)许多相似的字典行:

{'ID': ['133528'], 'OPEN': ['1/1/2016', '2/1/2016', '3/1/2016', '4/1/2016'], 'CLOSED': ['5/1/2016'], 'CHECKED': ['1/7/2016']}

{'ID': ['176987'], 'OPEN': ['3/6/2016', 4/6/2016'], 'CLOSED': [], 'CHECKED': ['1/7/2016',2/7/2016]}

{'ID': ['347697'], 'OPEN': ['1/2/2016'], 'CLOSED': ['1/3/2016'], 'CHECKED': []}

我需要的是把这些字典(行)以这个表的形式写入CSV文件->

133528,'OPEN','1/1/2016'
133528,'OPEN','2/1/2016'
133528,'OPEN','3/1/2016'
133528,'OPEN','4/1/2016'
133528,'CLOSED','5/1/2016'
133528,'CHECKED','1/7/2016'
176987,'OPEN','3/6/2016'
176987,'OPEN','4/6/2016'
176987,'CHECKED','1/7/2016'
176987,'CHECKED','2/7/2016'
347697,'OPEN','1/2/2016'
347697,'CLOSED','1/3/2016'

我只需要使用 Python 2.6 中的内置库(没有 Pandas)

我尝试了一些转换 + 使用 csv.writerow 但我做不到。 你能帮帮我吗?

【问题讨论】:

  • 所需的输出可能并不总是按那个顺序排列,因为它是一个如此无序的字典......
  • 这不是问题。我将从另一个软件中将其读取为 CSV :-)

标签: python dictionary transformation export-to-csv python-2.6


【解决方案1】:

您正在使用中间字典步骤使事情复杂化。您可以在从旧文件中读取行时编写新文件。

import csv

with open('new_format.csv', 'w') as csvfile:
    fieldnames = ['id', 'status', 'date']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)

    for row in file:
        ....
        ....
        ....
        [writer.writerow({'id': id, 'status': 'OPEN', 'date': d}) for d in open_days]
        [writer.writerow({'id': id, 'status': 'CLOSED', 'date': d}) for d in closed_days]
        [writer.writerow({'id': id, 'status': 'CHECKED', 'date': d}) for d in checked_days]

【讨论】:

  • 我只需要改变两件事。我删除了表达式周围的方括号,并且我使用了 writer.writerows 而不是 writer.writerow,因为它写出我的字典包含的字段名与我的 writer 不同。我不明白为什么,我也不明白为什么它会在每个之后生成空白行,但它现在可以工作了。谢谢!
  • 谢谢,现在它的工作方式与 write.writerows 的“我的版本”相同......你能解释一下,函数周围的方括号是如何工作的吗?我不知道在哪里查看文档...
  • 这是一个列表理解。非常方便,你应该了解它们:secnetix.de/olli/Python/list_comprehensions.hawk
【解决方案2】:

安德鲁的回答对我来说并不是 100% 有效,但在我做了一些小改动之后:

import csv

with open('new_format.csv', 'w') as csvfile:
    fieldnames = ['id', 'status', 'date']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)

    for row in file:
        ....
        ....
        ....
        writer.writerows({'id': id, 'status': 'OPEN', 'date': d} for d in open_days)
        writer.writerows({'id': id, 'status': 'CLOSED', 'date': d} for d in closed_days)
        writer.writerows({'id': id, 'status': 'CHECKED', 'date': d} for d in checked_days)

确实如此,而且看起来几乎正确(我不知道为什么会出现空白行):

    ...
    8: 4882410,CLOSED,2016-11-09
    9:
    10: 4882410,CLOSED,2016-11-10
    11:
    12: 4882410,CLOSED,2016-11-11
    ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-13
    • 2019-04-21
    • 1970-01-01
    • 2021-08-01
    • 1970-01-01
    • 2022-10-04
    • 2021-04-27
    • 1970-01-01
    相关资源
    最近更新 更多