错误说明解压得太多了

时间:2016-03-12 18:31:59

标签: python

我正在尝试将包含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

2 个答案:

答案 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