2017-05-04 64 views
0

我有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(无熊猫)

我试过一些转换+使用csv.writerow,但我不能这样做。 你能帮我一下吗?

+0

所需的输出可能并不总是按照这个顺序,因为它是如此无序的字典... – Aditya

+0

这是没有问题的。我会从另一个软件读取它作为CSV :-) – Akiz

回答

0

您正在使用中间字典步骤使事情变得复杂。您可以在读取旧文件中的行时写入新文件。

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] 
+0

我只能改变两件事。我已经删除了表达式的方括号,并且我使用writer.writerows而不是writer.writerow,因为它写出我的字典包含的字段名不同于我的作者。我不明白为什么 ,我也不明白为什么它会在每一行后产生空行,但现在它可以工作。谢谢! – Akiz

+0

尝试更新代码 – andrew

+0

谢谢,现在它的工作方式与使用write.writerows的“我的版本”一样... 您能否解释一下函数的方括号如何工作?我不知道在哪里查看文档... – Akiz

0

安德鲁的回答并没有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 
    ...