Python 用于创建文本文件的哨兵循环

Python Sentinel Loop to create a Text File

我正在尝试弄清楚如何创建标记代码以允许用户输入将在文本文件中列出的姓名和测试分数。我只需要将名字放在文本文件的第一列中,将分数放在文本文件的第二列中。我尝试将姓名和成绩作为单一输入,但出现错误。我仍然收到以下代码的错误。

输入学生姓名和考试成绩。将输入的数据存储在名为 Class.txt 的文本文件中,然后关闭该文件。使用空字符串作为标记来停止数据输入。确保该程序只接受学生考试成绩的正确数据。

def main():
    outfile = open("Class.txt", 'w')

    count = 0
    student = input("Please enter a student's last name (<Enter> to quit): ")
    grade = eval(input("Please enter the student's grade (<Enter> to quit): "))
    while student != "" and grade != "":
        count = count + 1
        student = input("Please enter a student's last name (<Enter> to quit): ")
        grade = eval(input("Please enter the student's grade (<Enter> to quit): "))
        print(student, grade, file = outfile)

    outfile.close()

main()

错误:

  grade = eval(input("Please enter the student's grade (<Enter> to quit): "))
  File "<string>", line 0

    ^
SyntaxError: unexpected EOF while parsing

您正在向 eval 发送未经过滤的用户输入 - 这是一种非常不安全的做法,也是在您尝试使用标记时导致错误的原因([=13 的空输入=]).如果名称为空,你不应该真正要求 grade

为避免重复,您应该将 input 调用放在一个函数中:

def get_data():
    student = input("Please enter a student's last name (<Enter> to quit): ")
    if student:
        grade = input("Please enter the student's grade (<Enter> to quit): ")
        if grade.isdigit():
            return (student, int(grade))
    return (None, None)

我添加了一个隐式标记 - 如果 grade 不是自然数,那么循环也会停止。

然后,您的循环将如下所示:

(student, grade) = get_data()
while student:
    print(student, grade, file = outfile)
    (student, grade) = get_data()

请注意,我在主循环中交换了输入和输出的顺序,因为在您的原始代码中,第一个输入不会被处理。