从python中的csv文件形成字典时出错

时间:2015-09-04 17:59:27

标签: python csv dictionary

我有一个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_tab

当我没有使用rU_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,...)]

如何解决此错误并形成我在上面的帖子中提到的结构ver('distcomp') 的字典?

2 个答案:

答案 0 :(得分:1)

你选择的方言似乎是错的。 csv.excel_tab使用制表符字符作为分隔符。对于您的数据,默认方言应该有效。

由于U模式中缺少rU,您之前收到了有关换行符的错误消息。

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

这个例子似乎对我有用(Python 3)。

答案 1 :(得分:0)

如果您有重复键,则需要将值存储在某个容器中,如果您想要订购数据,则需要使用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)来编写密钥,因为您只是遍历字典的键,而不是键和值。如果数据不是按时间顺序排列,则必须使用itemgetter在reader对象上调用sort:

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