如何撤消我在 close() 之前正在写的内容?

How do I undo what I'm currently writing before close()?

for i in range(0,5):
    
    f = open("StudentRecords.txt", "a")
    try:
        f.write(input("Name: ")+"\n")
        f.write(str(int(input("ID: ")))+"\n")
        f.write(str(float(input("GPA: ")))+"\n")
    except ValueError:
        print("Error: You entered a String for ID or GPA.")
    
    f.close()

例如,如果我尝试为 GPA 编写一个字符串,我将捕获错误并且程序将继续,但仍会写入相同迭代的名称和 ID 我希望它只在所有 3 个数据都有效时才写入。

正如评论所说,最好的方法是在编写任何内容之前验证所有数据。但如果你真的需要撤销,你可以通过保存每条记录之前的文件位置,寻找回它,并截断以删除后面写入的所有内容来完成。

而不是为每条记录重新打开文件,您应该在循环之前打开它一次。使用with在块完成时自动关闭它。

with open("StudentRecords.txt", "w") as f:
    for i in range(0,5):
        try:
            filepos = f.tell()
            f.write(input("Name: ")+"\n")
            f.write(str(int(input("ID: ")))+"\n")
            f.write(str(float(input("GPA: ")))+"\n")
        except ValueError:
            print("Error: You entered a String for ID or GPA.")
            f.seek(filepos)
            f.truncate()

简单的解决方案是先将输入保存在变量中,然后再保存到文件中。

for i in range(0,5):
    
    f = open("StudentRecords.txt", "a")
    try:
        name = input("Name: ")+"\n"
        ID = str(int(input("ID: ")))+"\n"
        GPA = str(float(input("GPA: ")))+"\n"
        f.write(name + ID + GPA)
    except ValueError:
        print("Error: You entered a String for ID or GPA.")
    
    f.close()

话虽如此,我还是建议多更新一下代码:

for i in range(0,5):
    name = input("Name: ") + "\n"
    try:
        ID = str(int(input("ID: "))) + "\n"
        GPA = str(float(input("GPA: "))) + "\n"

        with open("StudentRecords.txt", "a") as f:
            f.write(name + ID + GPA)
    except ValueError:
        print("Error: You entered a String for ID or GPA.")

使用 with 意味着您不必处理 f.close() 等其他事情,因此您不会忘记它。由于 name = ... 行似乎不需要 try-except 块,我们可以将其移到外面。

其他人已经向您展示了一种验证数据的方法,但现在如果用户犯了错误,程序就会停止。你真的想要一些方法让他们纠正他们的错误并继续。

要将其放入您的主例程中,每个数字都需要一个单独的循环和 try/except 结构,这在现在有两个值时还算不错,但变得笨拙你再补充。

因此,与其重复我们自己,不如编写一个重复的函数,直到用户输入有效数字。我们可以传入我们想要的数字类型(intfloat)。

def inputnum(prompt, T=float):
    while True:
        try:
            return T(input(prompt))
        except ValueError:
            print(">>> You entered an nvalid number. Please try again.")

然后调用该函数来获取您的号码(结合其他一些小的改进):

with open("StudentRecords.txt", "a") as f:
    for i in range(5):
        name = input("Name: ")
        ID = inputnum("ID: ", int)
        GPA = inputnum("GPA: ", float)
        f.write(f"{name}\n{ID}\n{GPA}\n")