逐行移动文本文件内容时程序冻结问题求助
问题分析与代码修正
原代码核心问题
- 无限循环导致程序冻结:
while range(len(lines)) != 0:这个条件永远成立,因为range(len(lines))返回的是一个range对象,和整数0比较永远不会相等,循环无法终止。 - 文件操作不规范:多处打开文件后未关闭,会造成资源泄漏;每次循环重复读取整个文件,效率极低。
修正后的代码(高效版)
这个版本直接一次性完成所有行的移动,逻辑简洁且性能最优:
# 使用with语句自动管理文件句柄 with open("file1.txt", 'r', encoding="utf-8-sig") as f1, open("file2.txt", 'w', encoding="utf-8-sig") as f2: # 读取file1所有内容并写入file2 content = f1.read() f2.write(content) # 清空file1 with open("file1.txt", 'w', encoding="utf-8-sig"): pass
模拟逐行移动的修正版(贴合原需求逻辑)
如果确实需要模拟逐行移动的过程(比如处理极大型文件时逐行操作节省内存),可以用以下代码:
# 初始化file2 with open("file2.txt", 'w', encoding="utf-8-sig"): pass while True: # 读取并移除file1的第一行 with open("file1.txt", 'r+', encoding="utf-8-sig") as f1: lines = f1.readlines() if not lines: # 文件为空时退出循环 break first_line = lines[0] # 写入file2 with open("file2.txt", 'a', encoding="utf-8-sig") as f2: f2.write(first_line) # 重置文件指针并写入剩余行 f1.seek(0) f1.writelines(lines[1:]) f1.truncate() # 截断文件,移除多余内容
关键建议
- 强制使用
with语句:自动处理文件的打开与关闭,彻底避免文件句柄泄漏问题。 - 避免重复IO操作:原代码每次循环都重复读取整个文件,大文件场景下会严重拖慢速度,尽量一次性读取或批量处理。
- 循环条件要基于实际状态:判断文件是否为空、剩余行数是否为0等实际状态,而非错误的对象比较。
内容的提问来源于stack exchange,提问作者Lavonen
相关产品推荐
相关产品推荐

