You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 13:33:24