使用CSV的第一行作为嵌套字典中的键



请不要残忍!我是编码的新手,我在网上到处找答案。我有一个CSV,第一列列出了姓名,第二列列出了工作,第三列列出了出生月份。我想要我在代码下面键入的输出。我制作了这本词典,但它的格式是:{;Karen Fisher":("it","November"(等}我希望嵌套词典的关键字来自csv的标题,这样人们就知道他们正在查看关于每个人的什么样的数据。我得到了这个错误:";TypeError:"tuple"对象不支持项分配">

with open("Example1.csv", "r") as csvfile:
csvreader = csv.reader(csvfile, delimiter=',')
row1  = next(csvreader)
#print(row1)
def makeadictionary(csvreader):
dct = {}
keys = []
valuesdict = {}
names = []
next(csvreader)
for row in csvreader:
keys.append(row[0])
dct[row[0]] = row[1],row[2]
names.append(row[0])
#print(names)
for key,value in dct.items():
value = list(value)
#print(value)
job = value[0]
#print(job)
birthmonth = value[1]  
#print(birthmonth)
dct[key][row1[1]] = job
dct[key][row1[2]] = birthmonth
return dct
print(makeadictionary(csvreader))

目标输出:{quot;Karen Fisher":{;job":"IT"、"出生月份":"11月"}等}

查看代码中的以下行:

dct[row[0]] = row[1],row[2]

这将创建以下形式的字典:

{"Karen Fisher": ("IT", "November")}

注意,";Karen Fisher";映射到大小为2的元组,也就是说,如果访问dct["Karen Fisher"],则获得元组("IT", "November")。现在看看导致错误的行:

dct[key][row1[1]] = job

我们知道dct[key]等于("IT", "November")row1[1]等于"job",所以python试图执行的是以下表达式:

("IT", "November")["job"] = job

所以它的结构是a[b] = c,其中a是元组。这不起作用有两个原因,一个是不能为元组执行该形式的索引赋值(元组只能创建,不能修改(,另一个是无法用字符串为元组编制索引。

您似乎想做的是在字典中分配一个项,但手头没有字典:dct是字典,但dct[key]是元组。您可以做的是创建字典:

dct[key] = {row1[1]: job, row1[2]: birthmonth]}

这应该有效,但还有一个小问题。在遍历字典时修改字典通常不是一种好的做法。您也不需要对所有内容进行两次迭代。我认为您有一个错误,您跳过了标头后的第一行数据(在makeadictionary中的next(csvreader)调用中(。最后,您不需要为想要完成的任务创建嵌套函数。

我建议如下:

with open("Example1.csv", "r") as csvfile:
csvreader = csv.reader(csvfile, delimiter=',')
header_row  = next(csvreader)
result = {}
for row in csvreader:
name = row[0]
result[name] = {}
for field_name, value in zip(header_row[1:], row[1:]):
# The zip function 'mixes' the two lists:
# zip([a, b, c], [d, e, f]) == [(a, d), (b, e), (c, f)]
result[name][field_name] = value
print(result)

csv。DictReader类将返回一本词典。你所要做的就是按密钥存储条目:

from pprint import pprint
import csv
f = open('x.csv','r')
track = {}
for row in csv.DictReader(f):
track[row['name']] = dict(row)
pprint( track )

输出:

{'Joe Blow': {'birth month': 'April', 'job': 'HR', 'name': 'Joe Blow'},
'Karen Fisher': {'birth month': 'November',
'job': 'IT',
'name': 'Karen Fisher'}}

最新更新