Python 3.x 文本文件读取和写入,值错误:需要超过1个值才能解包

Python 3.x 文本文件读取和写入,值错误:需要超过1个值才能解包,python-3.x,Python 3.x,我需要在一个def中创建一个程序,打开一个文本文件“grades”,其中first、last和grade由comas分隔。每行是一个独立的学生。然后显示学生和成绩以及班级平均成绩。然后继续添加另一个学生和成绩,并将其保存到文本文件中,同时包括旧学生。 我想我只是不明白python如何处理文本文件。如果我把“行”注释掉,我会看到它打印出旧的名称,但好像所有的东西都在后面。当行未注释掉时,不会打印“旧名称”,这使我认为文件已关闭?还是空的?但是,所有内容仍按原样保存在txt文件中 目前我得到这个错误

我需要在一个def中创建一个程序,打开一个文本文件“grades”,其中first、last和grade由comas分隔。每行是一个独立的学生。然后显示学生和成绩以及班级平均成绩。然后继续添加另一个学生和成绩,并将其保存到文本文件中,同时包括旧学生。 我想我只是不明白python如何处理文本文件。如果我把“行”注释掉,我会看到它打印出旧的名称,但好像所有的东西都在后面。当行未注释掉时,不会打印“旧名称”,这使我认为文件已关闭?还是空的?但是,所有内容仍按原样保存在txt文件中

目前我得到这个错误。。。。我敢肯定这是在告诉我我是个弱智“线”里没有任何信息

File "D:\Dropbox\Dropbox\1Python\Batch Processinga\grades.py", line 45, in main
    first_name[i], last_name[i], grades[i] = line.split(',')
ValueError: need more than 1 value to unpack
最终目标是让它告诉我当前的学生姓名和平均成绩。然后添加一名学生,将该学生和成绩保存到文件中。然后,能够把所有的学生包括新学生的文件都拉回来,然后重新做一遍。 我为自己是个笨蛋而道歉

def main():
    #Declare variables
    #List of strings: first_name, last_name
    first_name = []
    last_name = []
    #List of floats: grades
    grades = []
    #Float grade_avg, new_grade
    grade_avg = new_grade = 0.0
    #string new_student
    new_student = ''


    #Intro
    print("Program displays information from a text file to")
    print("display student first name, last name, grade and")
    print("class average then allows user to enter another")
    print("student.\t")

    #Open file “grades.txt” for reading
    infile = open("grades.txt","r")

    lines = infile.readlines()

    old_names = infile.read()
    print(old_names)

    #Write for loop for each line creating a list
    for i in len(lines):
         #read in line
         line = infile.readline()

         #Split data
         first_name[i], last_name[i], grades[i] = line.split(',')

         #convert grades to floats
         grades[i] = float(grades[i])

    print(first_name, last_name, grades)
    #close the file
    infile.close()

    #perform calculations for average
    grade_avg = float(sum(grades)/len(grades))


    #display results
    print("Name\t\t Grade")
    print("----------------------")
    for n in range(5):
        print(first_name[n], last_name[n], "\t", grades[n])

    print('')
    print('Average Grade:\t% 0.1f'%grade_avg)

    #Prompt user for input of new student and grade
    new_student = input('Please enter the First and Last name of new student:\n').title()
    new_grade = eval(input("Please enter {}'s grade:".format(new_student)))

    #Write new student and grade to grades.txt in same format as other records
    new_student = new_student.split()
    new_student = str(new_student[1] + ',' + new_student[0] + ',' + str(new_grade))

    outfile = open("grades.txt","w")

    print(old_names, new_student ,file=outfile)

    outfile.close()enter code here

Python中的文件对象有一个“文件指针”,它跟踪您已经从文件中读取的数据。当您调用
read
readline
readlines
时,它使用此命令来知道从何处开始查找。调用
readlines
将文件指针一直移动到文件末尾;后续读取调用将返回空字符串。这解释了为什么在
行中出现ValueError。拆分(',')
line
是一个空字符串,因此
line.split(“,”)
返回一个长度为0的列表,但您需要一个长度为3的列表来执行尝试的三重赋值

一旦获得
列表,就不再需要与
infle
对象交互。你已经有了所有的线路;您也可以直接遍历它们

#Write for loop for each line creating a list
for line in lines:
    columns = line.split(",")
    first_name.append(columns[0])
    last_name.append(columns[1])
    grades.append(float(columns[2]))

请注意,我使用的是
append
,而不是
listName[I]=which
。这是必要的,因为当您尝试分配给一个尚不存在的索引时,Python列表不会自动调整自身大小;您只需获得一个
索引器
<另一方面,代码>附加将根据需要调整列表的大小。

谢谢,您的解释很到位,我可能需要再看几遍,但我明白了。现在,如果我能让文件在文本文件中写下这些旧名字,它们是什么样子的,而不是这样的…[米奇,老鼠,90\n',简,多伊,50\n',米妮,老鼠,95\n',唐老鸭,鸭子,80\n',达菲,鸭子,70\n']Lars,Olrich,69