如何从每个键具有多个值的字典中编写csv文件?

时间:2015-05-13 20:30:26

标签: python csv dictionary arcgis

我最初将此问题作为另一个问题的一部分发布。我需要写一个csv文件,其中它给我技术人员的姓名,他们在一个领域工作的日期,以及该日期的小册子数量。我已经找到了一种方法,将所需数据输入字典,其中键是技术人员的名称,值是日期和计数,使用光标查看ArcMap以查找数据,使用如下代码: / p>

desc = arcpy.Describe(inLayer)
fields =  desc.fields
for field in fields:
    for srow in cursor:
        tech = srow.getValue("Technician")
        ModDate = srow.getValue("ModifiedDate")
        FormDate = ModDate.strftime("%m-%d-%Y")
        if tech == "Elizabeth":
            EScontract = EScontract + 1
            ESList = []            
            ESList.append(FormDate)
            EStech.update(ESList)
            for date in EStech.iteritems():
                if tech in Listedtech:
                    Listedtech[tech].append(date)
                else:
                    Listedtech[tech] = [date]

其中EStech是之前定义的Counter字典,而且且为更早定义的空字典。

印刷后的印刷技术似乎如下:

Listedtech = {u'Elizabeth': [('05-11-2015', 6), ('05-13-2015', 16), ('05-12-2015', 16)] , u'Michael': [('05-11-2015', 3)]}

如何将名为Listedtech的词典转换为csv文件?

更新

我已成功将我的字典变成了一个名为nl的字典列表。当我打印我的词典列表时,我会得到这样的结果:

nl = [{u'Elizabeth': [('05-11-2015', 6), ('05-13-2015', 16), ('05-12-2015', 16)]} , {u'Michael': [('05-11-2015', 3)]}]

然而,现在我仍然遇到问题仍然是csv。当我使用DictWriter时,每个技术人员都拥有自己的列,但只有一行包含所有相关值,因此csv文件看起来像这样,这一点非常奇怪

伊丽莎白|迈克尔
('05 -11-2015',6),('05 -13-2015',16),('05 -12-2015',16)| ('05 -11-2015',3)

而不是像我想要的那样,每个值都在不同的行上。我使用的代码是这样的:

with open(csvfilename, 'w') as f:
    fieldnames = ['Elizabeth', 'Michael']
    dict_writer = csv.DictWriter(f, fieldnames = fieldnames)
    dict_writer.writeheader()
    dict_writer.writerows(nl)

我做错了什么?

1 个答案:

答案 0 :(得分:2)

您可以使用csv.DictWriter。来自文档:

import csv

with open('names.csv', 'w') as csvfile:
    fieldnames = ['first_name', 'last_name']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)

    writer.writeheader()
    writer.writerow({'first_name': 'Baked', 'last_name': 'Beans'})
    writer.writerow({'first_name': 'Lovely', 'last_name': 'Spam'})
    writer.writerow({'first_name': 'Wonderful', 'last_name': 'Spam'})