我正在尝试将包含student_id,last_name,test_grades_1,test_grades_2,test_grades_3,test_grades_4形式的测试数据的文件读入一个字典,其中key为student_id,rest属性为值。
CODE:
def create_grades_dict(file_name):
my_dict={}
file_pointer=open(file_name, "r")
data = file_pointer.readlines()
for line in data:
stud_id, last_name, test_1, test_2, test_3, test_4 = line.strip().split(',')
avg = (test_1 + test_2 + test_3 + test_4)/4.0
my_dict[stud_id]=[last_name, test_1, test_2, test_3, test_4, avg]
return my_dict
ERROR:
Error in evaluating function:
ValueError at line 6
too many values to unpack
输入文件的示例如下所示。输入输出示例假设输入文件“student_grades.txt”包含以下文本:
1000123456,Rubble,Test_3,80,Test_4,80
1000123459,Chipmunk,Test_4,96,Test_1,86,Quiz_1,88
答案 0 :(得分:3)
你得到的错误"太多的值无法打开"如果你做,例如a, b = (3, 4, 5)
显然,line.strip().split(',')
导致列表中的值超过六个。我会在此列表中添加print
以查看问题所在。
[...]
for line in data:
print line.strip().split(',')
编辑,猜测:成绩的值可能是非整数,并用逗号写。在这种情况下,你应该使用split(', ')
(带空格),如果用空格输入值...如果没有,你必须搜索用正则表达式数字包围的逗号
修改后修改: 好吧,输入与你描述的完全不同:)
看起来这样的事情会这样做:
for line in data:
datalist = line.strip().split(',')
if len(datalist) < 2:
continue
stud_id, last_name = datalist[:2]
namelist, gradelist = [], []
for name in datalist[2::2]:
namelist.append(name.strip())
for grade in datalist[3::2]:
gradelist.append(int(grade.strip()))
namelist.append('avg')
avg = sum(gradelist)/float(len(gradelist))
gradelist.append(avg)
newdict = dict(zip(namelist, gradelist))
my_dict[stud_id]=[last_name, newdict]
现在你有一个dict,每个id都有一个dict。内部字典具有测试名称的标签作为键和每个的等级。 要处理它,你必须考虑到每个学生的可用测试是不同的......
答案 1 :(得分:0)
您可以按如下方式解决此问题:
def create_grades_dict(file_name):
my_dictionary = {}
file_pointer = open(file_name, 'r')
data = file_pointer.readlines()
for line in data:
student_row = map(str.strip, line.strip().split(','))
student_id = student_row.pop(0)
student_lastname = student_row.pop(0)
student_data = [student_lastname]
for valid_test in ['Test_1', 'Test_2', 'Test_3', 'Test_4']:
if valid_test in student_row:
student_data.append(int(student_row[student_row.index(valid_test) + 1]))
else:
student_data.append(0)
student_data.append(sum(student_data[-4: ])/4)
my_dictionary[student_id] = student_data
return my_dictionary