文件引发EOFError

0 投票
4 回答
1376 浏览
提问于 2025-04-15 16:51
 import pickle
filename=input('Enter a file name:')

def commands():
    f=open(filename,'w')
    names=[]
    grades=[]
    while True:
            name=input("Give a student's name:")
            if name.lower()=='end':
                    f.close()
                    print("File closed")
                    print("Back to Menu")
                    break
            else:
                    x=names.append(name)
                    f.write(str(x))
            grade=input("Give student's grade:")          
            try:
                grade=float(grade)
                if 0<=grade<=10:
                    y=grades.append(grade)
                    f.write(str(y))
                else:
                    print("Please give a grade!Between 0-10! ")
            except ValueError:
                print(grade,"is not a number...Give only Numbers!")




def syn2(filename):
    try:
        f=open(filename,'r')
        f.read(names)
        f.read(grades)
        d1={}
        d1[names]=grades
        print(d1)
        print("Back to Menu")
    except IOError:
        return False
Traceback (most recent call last):
  File "file1.py", line 68, in 
  File "file2.py", line 45, in syn2
NameError: global name 'names' is not defined

当我调用 syn2(filename) 的时候:

4 个回答

1

你的程序在意料之外的地方遇到了文件的结束标志,叫做“EOF”。

1

我建议把学生和成绩放在一个字典里。这样,如果用户输入完毕,就可以用 pickle 把这个字典保存到一个文件里。就像下面这样:

grades = {}
while True:
    # ask for student's name n
    # ...

    if n.lower() == 'end':
        break

    # ask for student's grade g
    # ...

    grades[n] = g

pickle.dump(grades, yourfile)
1

你遇到的错误 global name 'names' is not defined 是因为你在 def entoles() 这个函数里面定义了 names,所以它只能在这个函数内部被看到。

如果你想在函数外部也能使用 names,你需要把它放在 def entoles() 之外来定义。

另外,

x=names.append(name)
f.write(str(x))

append 是一个方法,它可以把你传入的项目直接加到列表里。这个方法返回的是 'None',所以 f.write(str(x)) 会写入 'None'。

编辑:你可以查看这个 Python文档,了解关于输入/输出的内容,还有这个 Python文档,了解 input/raw_input 的用法

撰写回答