在python中从csv文件生成字典时出错

2024-09-30 22:11:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个csv文件,其结构如下:

Year-Sem,Course,Studentid,Score
201001,CS301,100,363
201001,CS301,101,283
201001,CS301,102,332
201001,CS301,103,254
201002,CS302,101,466
201002,CS302,102,500

这里每年分为两个学期——01(秋季)和02(春季),数据从2008年到2014年(共14个学期)。现在我要做的是建立一个字典,其中coursestudentid成为键,并且它们各自的scoreyear-sem作为值排序。所以每个学生的输出应该是这样的:

[(studentid,course):(year-sem1 score,year-sem2 score,...)]

我第一次尝试用这段代码制作[(studentid,course):(score)]的字典,但得到的错误是IndexError: list index out of range

with open('file1.csv', mode='rU') as infile:
        reader = csv.reader(infile,dialect=csv.excel_tab)
        with open('file2.csv', mode='w') as outfile:
            writer = csv.writer(outfile)
            mydict = {(rows[2],rows[1]): rows[3] for rows in reader}
            writer.writerows(mydict)

当我没有使用dialect=csv.excel_tabrU时,我得到的错误是_csv.Error: new-line character seen in unquoted field - do you need to open the file in universal-newline mode?。你知道吗

如何解决这个错误并用我在上面的文章中提到的结构[(studentid,course):(year-sem1 score,year-sem2 score,...)]生成字典?你知道吗


Tags: csvin字典mode错误open结构year
2条回答

如果有重复键,则需要将值存储在某个容器中,如果要对数据进行排序,则需要使用OrderedDict

import csv
from collections import OrderedDict

with open("in.csv") as infile, open('file2.csv', mode='w') as outfile:
    d = OrderedDict()
    reader,  writer = csv.reader(infile), csv.writer(outfile)
    header = next(reader) # skip header
    # choose whatever column names you want
    writer.writerow(["id-crse","score"])
     # unpack the values from each row
    for yr, cre, stid, scr in reader:
        # use id and course as keys and append scores
        d.setdefault("{} {}".format(stid, cre),[]).append(scr)
    # iterate over the dict keys and values and write each new row
    for k,v in d.items():
        writer.writerow([k] + v)

这会给你一些类似的东西:

id-crse,score
100 CS301,363
101 CS301,283
102 CS301,332
103 CS301,254
101 CS302,466
102 CS302,500

在您自己的代码中,您只存储键的最后一个值,也只使用writer.writerows(mydict)编写键,因为您只是迭代dict的键,而不是键和值。如果数据不是按时间顺序排列的,则必须使用itemgetter调用reader对象上的sorted:

for yr, cre, stid, scr in sorted(reader,key=operator.itemgetter(3)):
   ............

你选择的方言好像不对。csv.excel_tab使用制表符作为分隔符。对于您的数据,默认方言应该可以使用。你知道吗

由于在rU模式中缺少U,您在前面得到了关于换行的错误消息。你知道吗

with open(r"test.csv", "rU") as file:
    reader = csv.reader(file)
    for row in reader:
        print(row)

这个例子似乎适合我(python3)。你知道吗

相关问题 更多 >