【问题标题】:Python Sentinel Loop to create a Text FilePython Sentinel Loop 创建文本文件
【发布时间】:2020-05-13 00:49:11
【问题描述】:

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

输入学生的姓名和考试成绩。将输入的数据存储在名为 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

【问题讨论】:

  • "我仍然收到以下代码的错误。" 告诉我们错误是什么会很有用。
  • @takendarkk 已修复

标签: python file sentinel


【解决方案1】:

您正在向eval 发送未经清理的用户输入 - 这是一种非常不安全的做法,并且当您尝试使用哨兵时,这也是导致错误的原因(grade 的输入为空)。如果名称为空,您不应该真正要求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()

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

【讨论】:

  • 非常感谢!几周前我开始使用多个功能,所以我应该尝试习惯使用你提到的那个。非常感谢您的帮助,一切正常!
猜你喜欢
  • 2019-06-19
  • 1970-01-01
  • 1970-01-01
  • 2017-07-07
  • 2015-02-12
  • 1970-01-01
  • 2011-06-02
  • 1970-01-01
  • 2012-08-03
相关资源
最近更新 更多