从csv文件编写python字典

从csv文件编写python字典,python,csv,dictionary,Python,Csv,Dictionary,我现在正在努力从csv文件编写字典 csv文件的格式如下: student, Test 1, Test 2, Test 3, Final Exam A, 9, 19, 9, 22 B, 10, 16, 9, 26 C, 11, 17, 8, 27 D, 7, 14, 9, 18 E, 8,

我现在正在努力从csv文件编写字典

csv文件的格式如下:

student,    Test 1, Test 2, Test 3, Final Exam
A,          9,      19,    9,       22
B,          10,     16,    9,       26
C,          11,     17,    8,       27
D,          7,      14,    9,       18
E,          8,      20,    8,       23
weight,     0.15,   0.25,  0.2,     0.4
max_points  12      20     9        30
其中2-6行是学生的名字,他们在每次考试中的分数。 最后两行分别代表每个测试的权重和每个测试的满分

现在,我想从以下列表创建一个字典:

{'Test 1': {'weight': '0.15', 'max_points': '12'}, 
'Test 2': {'weight': '0.25', 'max_points': '20'}, 
'Test 3': {'weight': '0.2',   'max_points': '9'}, 
'Final Exam': {'weight': '0.4', 'max_points': '30'}}
其中,键是csv文件中第一行的变量,变量student除外;在每个嵌套字典中,键是csv文件中第一列和最后两行的名称:权重、最大点数。相应的值只是它们各自行中的值

到目前为止,我唯一想到的是:

reader = csv.DictReader(open('gradebook.csv'))
for row in reader:
    key = row.pop('Student')

我不知道该怎么做。非常感谢你的帮助

使用熊猫,这是一个单行程序

import pandas as pd

df = pandas.read_csv('myfile.csv', delim_whitespace=True)
{ k: { 'max_points': df[k].max(), 'weight': df[k][5] } for k in df.keys()[1:] }
编辑。 哎呀,我明白了,这不是真的在找max()

顺便说一下,如果熊猫不能正确识别你的标题

df = pd.read_csv('/tmp/df.txt',delim_whitespace=True, header=1, names=['Student','Test 1','Test 2','Test 3','Final Score'])

使用熊猫,这是一个单一的班轮

import pandas as pd

df = pandas.read_csv('myfile.csv', delim_whitespace=True)
{ k: { 'max_points': df[k].max(), 'weight': df[k][5] } for k in df.keys()[1:] }
编辑。 哎呀,我明白了,这不是真的在找max()

顺便说一下,如果熊猫不能正确识别你的标题

df = pd.read_csv('/tmp/df.txt',delim_whitespace=True, header=1, names=['Student','Test 1','Test 2','Test 3','Final Score'])

这里有一个不使用熊猫的解决方案,它可以做你想做的事情。请注意,我的csv文件是一个实际的csv文件,因此您可能需要相应地调整读卡器的创建

In [13]: reader = csv.DictReader(open('tests.csv'))

In [14]: record = defaultdict(dict)

In [15]: for row in reader:
    ...:    if row['Student'] == 'weight':
    ...:        for header in reader.fieldnames[1:]:
    ...:            record[header]['weight'] = row[header]
    ...:    if row['Student'] == 'max_points':
    ...:        for header in reader.fieldnames[1:]:
    ...:            record[header]['max_points'] = row[header]


In [17]: from pprint import pprint

In [18]: pprint(record)
defaultdict(<class 'dict'>,
            {'Final Exam': {'max_points': '30', 'weight': '0.4'},
             'Test 1': {'max_points': '12', 'weight': '0.15'},
             'Test 2': {'max_points': '20', 'weight': '0.25'},
             'Test 3': {'max_points': '9', 'weight': '0.2'}})
[13]中的
:reader=csv.DictReader(打开('tests.csv'))
在[14]中:record=defaultdict(dict)
In[15]:对于读取器中的行:
…:如果行['Student']=“weight”:
…:对于reader.fieldnames[1:]中的标头:
…:记录[标题]['weight']=行[标题]
…:如果行['Student']=“max_points”:
…:对于reader.fieldnames[1:]中的标头:
…:记录[标题]['max_points']=行[标题]
在[17]中:从pprint导入pprint
In[18]:pprint(记录)
defaultdict(,
{‘期末考试’:{‘最高分数’:‘30’,‘体重’:‘0.4’},
'测试1':{'max_points':'12','weight':'0.15'},
'测试2':{'max_points':'20','weight':'0.25'},
'测试3':{'max_points':'9','weight':'0.2'})

如果您以前没有看到过
defaultdict
,那么当您尝试访问一个尚不存在的密钥时,传递给构造函数的任何内容都将用作值。

这里有一个解决方案,不使用熊猫,它应该可以满足您的需要。请注意,我的csv文件是一个实际的csv文件,因此您可能需要相应地调整读卡器的创建

In [13]: reader = csv.DictReader(open('tests.csv'))

In [14]: record = defaultdict(dict)

In [15]: for row in reader:
    ...:    if row['Student'] == 'weight':
    ...:        for header in reader.fieldnames[1:]:
    ...:            record[header]['weight'] = row[header]
    ...:    if row['Student'] == 'max_points':
    ...:        for header in reader.fieldnames[1:]:
    ...:            record[header]['max_points'] = row[header]


In [17]: from pprint import pprint

In [18]: pprint(record)
defaultdict(<class 'dict'>,
            {'Final Exam': {'max_points': '30', 'weight': '0.4'},
             'Test 1': {'max_points': '12', 'weight': '0.15'},
             'Test 2': {'max_points': '20', 'weight': '0.25'},
             'Test 3': {'max_points': '9', 'weight': '0.2'}})
[13]中的
:reader=csv.DictReader(打开('tests.csv'))
在[14]中:record=defaultdict(dict)
In[15]:对于读取器中的行:
…:如果行['Student']=“weight”:
…:对于reader.fieldnames[1:]中的标头:
…:记录[标题]['weight']=行[标题]
…:如果行['Student']=“max_points”:
…:对于reader.fieldnames[1:]中的标头:
…:记录[标题]['max_points']=行[标题]
在[17]中:从pprint导入pprint
In[18]:pprint(记录)
defaultdict(,
{‘期末考试’:{‘最高分数’:‘30’,‘体重’:‘0.4’},
'测试1':{'max_points':'12','weight':'0.15'},
'测试2':{'max_points':'20','weight':'0.25'},
'测试3':{'max_points':'9','weight':'0.2'})


如果您以前没有看到过
defaultdict
,那么当您尝试访问一个尚不存在的密钥时,传递给构造函数的任何内容都将用作值。

如图所示,您的文件不是CSV文件。CSV文件中的列用逗号分隔。@DYZ技术上是正确的,但现在将所有分隔文本文件称为CSV已成为一种常见做法。不是说它是对的或错的,只是说它很常见。@e4c5将数字称为“数字”已成为一种常见的做法。这并不能使他们成为数字,是吗?回到最基本的东西是没有坏处的。@DYZ我为这一混乱感到抱歉。我刚才省略了逗号,但你明白我的意思了吗?@dyz注意,在pandas中,读取上述文件的函数名为read_CSV。如图所示,您的文件不是CSV文件。CSV文件中的列用逗号分隔。@DYZ技术上是正确的,但现在将所有分隔文本文件称为CSV已成为一种常见做法。不是说它是对的或错的,只是说它很常见。@e4c5将数字称为“数字”已成为一种常见的做法。这并不能使他们成为数字,是吗?回到最基本的东西是没有坏处的。@DYZ我为这一混乱感到抱歉。我只是省略了逗号,但你明白我的意思吗?@dyz注意,在pandas中,读取上述文件的函数名为read_csvThanks。但是我可以不用熊猫来做这件事吗?当然可以,最大的困难是:-)这是一个很酷的解决方案,我需要更多地熟悉熊猫。我尝试了
min()
来计算重量,但是csv中的值不如二进制数:)@JoshSmeaton我还在学习!你的answe也很不错+不客气。我很高兴能帮上忙。既然你还是新来的,我想指出的是,在这里说“谢谢”的首选方式是投票选出好的问题和有用的答案(一旦你有足够的声誉这么做),并接受对你提出的任何问题最有用的答案(这也会给你的声誉带来一点提升)。谢谢但是我可以不用熊猫来做这件事吗?当然可以,最大的困难是:-)这是一个很酷的解决方案,我需要更多地熟悉熊猫。我尝试了
min()
来计算重量,但是csv中的值不如二进制数:)@JoshSmeaton我还在学习!你的answe也很不错+不客气。我很高兴能帮上忙。既然你还是新来的,我想指出的是,在这里说“谢谢”的首选方式是投票选出好的问题和有用的答案(一旦你有足够的声誉这么做),并接受对你提出的任何问题最有用的答案(这也会给你的声誉带来一点提升)。