从python中的csv文件形成字典时出错
我有一个csv文件,其结构如下:从python中的csv文件形成字典时出错,python,csv,dictionary,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个学期)。现在我想做的是建立一个字典,其中课程和学生I
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个学期)。现在我想做的是建立一个字典,其中课程
和学生ID
成为关键,并且相应的分数
按照年度sem
作为值排序。所以每个学生的输出应该是这样的:
[(studentid,course):(year-sem1 score,year-sem2 score,...)]
我首先尝试使用此代码制作[(studentid,course:(score)]
的字典,但由于索引器错误:列表索引超出范围
:
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)
当我没有使用方言=csv.excel\u选项卡
和rU
时,我得到的错误是\u csv.error:在不带引号的字段中看到新行字符-是否需要以通用换行模式打开文件?
我如何解决这个错误,并用我在上面的帖子中提到的结构
[(学生ID,课程):(一年级成绩,二年级成绩,…)]
构建字典?您选择的方言似乎是错误的csv.excel_选项卡
使用制表符字符作为分隔符。对于您的数据,默认方言应该可以使用
由于在rU
模式中缺少U
,您在前面收到了有关换行符的错误消息
打开(r“test.csv”、“rU”)作为文件:
reader=csv.reader(文件)
对于读取器中的行:
打印(行)
这个例子对我(Python 3)似乎很管用。如果您有重复键,则需要将值存储在某个容器中,如果您想要对数据进行排序,则需要使用: 这会给你一些类似的东西:
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)):
............
我如何形成字典中按年份排列的每个键的值部分?现在我正在建立一个结构词典,它是:
[(学生ID,课程):(分数)]
,但我希望它是[(学生ID,课程):(学年学期1分,学年学期2分,…)
?你可以把你的词典变成一个列表,其中每个条目都是一个列表:mydict=defaultdict(列表)
,然后你可以把它附加上:mydict[(studentid,course)].append(year-x score)
。我尝试了mydict={(行[1],行[2]):行[3]用于reader};writer.writerows(mydict)
但在我的输出文件中,我只看到键的值(行[1]和行[2]),而没有看到值(行[3])。您想要什么输出?我想要[(studentid,course)中的输出:(year-sem1 score,year-sem2 score,…)
那么基本上是按照它出现的顺序吗?@PadraicCunningham键可以是任何顺序,但每个键中的值应该是按年份的递增顺序排列的。如果数据是按顺序排列的,那么这些值应该按顺序排列,添加您希望从输入示例中获得的输出
for yr, cre, stid, scr in sorted(reader,key=operator.itemgetter(3)):
............