Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从python中的csv文件形成字典时出错_Python_Csv_Dictionary - Fatal编程技术网

从python中的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

我有一个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个学期)。现在我想做的是建立一个字典,其中
课程
学生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)):
   ............