如何撤消我在 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
结构,这在现在有两个值时还算不错,但变得笨拙你再补充。
因此,与其重复我们自己,不如编写一个重复的函数,直到用户输入有效数字。我们可以传入我们想要的数字类型(int
或 float
)。
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")
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
结构,这在现在有两个值时还算不错,但变得笨拙你再补充。
因此,与其重复我们自己,不如编写一个重复的函数,直到用户输入有效数字。我们可以传入我们想要的数字类型(int
或 float
)。
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")