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
相关产品推荐
相关产品推荐

