python从csv文件

时间:2017-01-26 03:09:26

标签: 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,      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文件中第一行的变量,除了变量学生;在每个嵌套字典中,键是csv文件中第一列和最后两行的名称:weight,max_points。相应的值分别只是其行中的值。

我现在唯一想到的是:

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

我不知道如何继续。非常感谢你的帮助!

2 个答案:

答案 0 :(得分:3)

使用熊猫,它是一个单一的

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:] }

编辑。 Opps,我看到OP实际上并不是在寻找max()

{ k: { 'max_points': df[k][6], 'weight': df[k][5] } for k in df.keys()[1:] }

顺便说一句,如果Pandas没有正确识别你的标题

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

答案 1 :(得分:2)

这是一个不使用pandas的解决方案,它应该做你想要的。请注意,我的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'}})

如果您之前没有看到defaultdict,那么无论您传递给构造函数的是什么,当您尝试访问尚未存在的密钥时,该值都将用作值。