Python逐行删除文件行脚本触发索引越界错误求助
问题根因
你的代码报索引越界、逻辑不生效是几个基础写法错误叠加导致的:
- 路径拼接错误:
os.path.dirname(__file__)返回的目录路径末尾不带系统路径分隔符,直接拼接文件名会生成错误的无效路径,要使用os.path.join()做路径拼接,自动适配不同系统的分隔符规则。 - 循环逻辑完全失效:你一开始定义
lines = []空列表,写的for line in lines从一开始就不会执行任何循环体内容;而且你在循环内部才给lines赋值、还在遍历列表的过程中修改列表本身,是触发索引越界的核心原因。 - 判断条件写反:你写的
len(line) < 1是判断当前遍历到的单行字符串长度是不是为空,和你要的「判断文件剩余行数小于1」的逻辑完全不相关。 - 写入逻辑错误:你执行
del lines[0]删除首行之后,写回文件时只写入了遍历到的单个line变量,没有把删除后剩余的所有行写回,会直接把文件内容改坏。 - 资源泄漏:文件存在的读取分支里,你打开文件后没有调用
close()关闭句柄,极端情况下会导致文件读取、写入异常。
修正后可运行代码
import os current_dir = os.path.dirname(__file__) SHA256_HASHES_pack1 = os.path.join(current_dir, 'SHA256-Hashes_pack1.txt') # 文件检测与初始化逻辑 if os.path.exists(SHA256_HASHES_pack1): with open(SHA256_HASHES_pack1, "r", encoding="utf-8") as f: print(f.read()) print("file already exists") else: with open(SHA256_HASHES_pack1, "w", encoding="utf-8") as f: f.write('''line 1 line 2 line 3''') print("i have wrote the file") # 逐行删除首行逻辑 with open(SHA256_HASHES_pack1, "r", encoding="utf-8") as f: all_lines = f.readlines() if len(all_lines) < 1: print("no line is available") else: # 删除第一行 del all_lines[0] # 剩余内容写回文件 with open(SHA256_HASHES_pack1, "w", encoding="utf-8") as f: f.writelines(all_lines) print("first line removed, file updated")
改动说明
- 所有文件操作改用
with上下文管理器写法,自动处理文件关闭,不需要手动写close(),从根源避免文件句柄泄漏问题。 - 移除了无意义的空列表循环,先完整读取文件所有行到内存,再做行数判断、删除、回写操作,逻辑更直白也不会触发遍历中修改列表的问题。
- 修正判断条件为判断读取到的总行数,行数不足1时直接打印提示,不会再触发索引越界。
- 回写文件时写入删除首行后的全部剩余行,保证文件内容符合预期。
- 新增
encoding="utf-8"参数,避免不同操作系统默认编码不一致导致的乱码问题。
内容的提问来源于stack exchange,提问作者Abdul Manan
相关产品推荐
相关产品推荐

