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

Python判断文件末行去重写入触发IndexError的排查与解决方法

报错原因

你遇到的IndexError: list index out of range是文件指针位置处理错误+代码逻辑漏洞导致的,具体问题点如下:

  • 用a+模式打开文件时,文件指针默认停在文件末尾,此时调用readlines()会直接从末尾开始读取,哪怕文件非空也会返回空列表,你原本写的try-except空文件判断逻辑从根上就失效了
  • 第一次调用readlines()后,不管有没有读到内容,文件指针都会停在读取结束的位置(也就是文件末尾),后续第二次调用FILE.readlines()[-1]时只能读到空列表,取索引-1直接触发索引越界
  • 代码存在变量名笔误:你定义的存储变量是FILE_STORED_DATA,后面判断相等时写的是未定义的STORED_DATA,就算索引问题解决了也会触发NameError
  • 裸except会捕获所有类型的异常,不管是读文件失败还是其他代码错误,都会无脑走空文件写入分支,逻辑可靠性极差
  • 就算except分支触发了写入操作,写入后文件指针依然停在文件末尾,后续的读取对比逻辑还是拿不到任何内容
修正后可运行代码
import requests

DATA = requests.get("...", params={"...": "...", "...": "..."}).json()
CURRENT_DATA = f"{DATA['time']}: {DATA['price']}\n"

# 用with上下文管理器自动处理文件关闭,避免资源泄漏
with open("SPRIT.log", "a+", encoding="utf-8") as log_file:
    # 核心修正:a+模式默认指针在末尾,先移动到文件开头才能读取已有内容
    log_file.seek(0)
    exist_lines = log_file.readlines()

    # 文件为空直接写入首行
    if not exist_lines:
        log_file.write(CURRENT_DATA)
    else:
        # 取最后一行对比,内容不一致才追加新行
        last_line = exist_lines[-1]
        if last_line != CURRENT_DATA:
            log_file.write(CURRENT_DATA)
关键修正说明
  • 打开文件后第一时间调用seek(0)将指针移到文件起始位置,保证能完整读到所有已有内容
  • 移除了不可靠的异常判断逻辑,直接通过读取到的行列表是否为空判断文件状态
  • 修正了变量名笔误,所有变量命名统一
  • 仅读取一次文件内容,避免多次读取时指针位置异常导致的空列表问题
  • 采用上下文管理器管理文件句柄,不需要手动调用close(),就算代码运行报错也能正常释放文件资源

内容的提问来源于stack exchange,提问作者user9409326

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 05:54:17