如何从每个键有多个值的字典中编写一个 csv 文件?
How do I write a csv file from a dictionary with multiple values per key?
我最初将此问题作为另一个问题的一部分发布。我需要编写一个 csv 文件,其中包含技术人员的姓名、他们处理单张的日期以及该日期的单张数量。我已经找到了一种将所需数据放入字典的方法,其中键是技术人员的姓名,值是日期和计数,使用光标查看 ArcMap 以查找数据,使用如下代码:
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 是较早定义的计数器字典,Listedtech 也是较早定义的空字典。
Listedtech 打印时看起来像:
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)
我做错了什么?
您可以使用 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'})
我最初将此问题作为另一个问题的一部分发布。我需要编写一个 csv 文件,其中包含技术人员的姓名、他们处理单张的日期以及该日期的单张数量。我已经找到了一种将所需数据放入字典的方法,其中键是技术人员的姓名,值是日期和计数,使用光标查看 ArcMap 以查找数据,使用如下代码:
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 是较早定义的计数器字典,Listedtech 也是较早定义的空字典。
Listedtech 打印时看起来像:
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)
我做错了什么?
您可以使用 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'})