Python如何撤销close()前的未提交写入,避免文件写入不完整数据
解决方法
有两种实现思路,优先推荐第一种,逻辑更简单性能也更好:
方案1:先校验全量数据,校验通过后再写入文件
你当前的核心问题是边输入边写入文件,只要前两项输入合法就已经写入了文件缓冲区,遇到异常时前面的内容已经存在,关闭文件时会自动刷入磁盘。最稳妥的解决方式是先把三项数据全部收集、校验完成后,再打开文件执行写入操作,根本不需要处理撤销写入的逻辑。
示例代码如下:
for i in range(5): try: # 先收集并校验所有数据 name = input("Name: ") + "\n" stu_id = str(int(input("ID: "))) + "\n" gpa = str(float(input("GPA: "))) + "\n" # 全部校验通过后再打开文件写入 with open("StudentRecords.txt", "a") as f: f.write(name) f.write(stu_id) f.write(gpa) except ValueError: print("Error: You entered a String for ID or GPA.")
这里额外用了with语法管理文件句柄,不需要手动调用close()方法,会自动处理文件关闭逻辑,避免遗漏关闭导致的资源泄漏。
方案2:打开文件后校验,出错时回滚已写入内容
如果你确实需要先打开文件再处理输入,可以在打开文件时先记录当前文件的末尾指针位置,一旦出现异常就把文件截断到之前记录的指针位置,即可撤销本次循环写入的所有内容:
示例代码如下:
for i in range(5): f = open("StudentRecords.txt", "a") # 记录打开文件时的初始指针位置(也就是文件末尾的位置) origin_pos = f.tell() 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.truncate(origin_pos) finally: f.close()
这个方案需要手动处理回滚逻辑,复杂度更高,实际使用优先选方案1即可。
内容的提问来源于stack exchange,提问作者أبو فهد Morphine pill
相关产品推荐
相关产品推荐

