从带有标题的csv文件创建字典

时间:2018-08-05 15:06:37

标签: python csv dictionary

我是python3的新手,需要一些帮助来解决以下考试。

有一个csv文件: id;姓名;数学;编程;英语;艺术;驾驶执照 1; Skye Davies; 4.7293186886448; 1.00694439962034; 1.50237929698571; 2;是 2; Bailey Porter; 2.04878889095744; 2.80668511477619; 1.06892193978582; 4; 3; Brett West; 3.69508976848625; 1.28352644513587; 2.89631143320307; 3;

我需要做的是创建一个函数readdatabase(filename)。此函数必须读取文件并将内容加载到名为rawdata的临时变量中。 填写gradebook变量并返回它。此变量必须是词典列表,其中每个词典都以

的形式包含一个学生的数据
{"name":string,"id":integer,'driving license':bool,"Math":float,"English":int,"Art":int,"Programming":int,"passed":bool}

我必须遍历rawdata变量,将数据转换为正确的类型,然后将其分配给字典中的正确键。原始文件包含每个主题的平均值(浮动)。将这些转换为1-5的等级。唯一的新字段(不包含在原始文件中)是:“已通过”。如果学生的成绩不为“ 1”,则该值必须为True。


我现在所拥有的:

def readdatabase(filename):

    csvfile=open(filename,'r')
    csvreader = reader(csvfile, delimiter=';')

    rawdata=[] 
    for row in csvreader:
        rawdata.append(row)
    csvfile.close()

    keys=rawdata[0]
    gradebook=[]

在这里,我很难将原始数据转换为成绩簿字典。将第一列放入字典,但其余的我不能:

for column in rawdata:

    rawdata=[dict(zip(rawdata[0][column].split(';'), v[column].split(';'))) for v in rawdata[1:]]

TypeError:列表索引必须是整数或切片,而不是列表

    return gradebook


gradebook=readdatabase('gradebook.csv')

成绩册1应该给出以下内容:

{'Art': 4,
 'English': 1,
 'Math': 2,
 'Programming': 3,
 'driving license': False,
 'id': 2,
 'name': 'Bailey Porter',
 'passed': False}

非常感谢。

2 个答案:

答案 0 :(得分:0)

您可能想引用csv.DictReader类:

with open("myfile.csv") as f:
    reader = csv.DictReader(f, delimiter=';')
    data = [r for r in reader]

然后data中的每个项目都是字典。

答案 1 :(得分:0)

最后,我用它来完成考试:

def readdatabase(文件名):

csvfile=open(filename,'r')
csvreader = reader(csvfile, delimiter=';')
gradebook=[]

bl = 'Yes'    
next(csvreader)

for lines in csvfile:

    le=lines.split(';')
    ide=le[0]
    name=le[1]
    Math=round(float((le[2])))
    Programming=round(float((le[3])))
    English=round(float((le[4])))
    Art=int(le[5])
    driving=bl in (le[6])
    if Math > 1 and Programming > 1 and English > 1 and Art > 1:
        passed='True'
    else:
        passed="False"
    gradebook.append({"id":ide,"name":name,"Math":Math,"Programming":Programming,"English":English,"Art":Art, "driving license":driving, "passed":passed})

csvfile.close()


return gradebook