我有一个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个学期)。现在我要做的是形成一个字典,其中course
和studentid
成为关键字,并且score
按year-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')
的字典?
答案 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)):
............