Python中读取新建空文件最后一行报错,如何解决?
问题分析与解决
核心问题
你的代码存在两个关键错误:
w+模式误用:用w+打开文件时,无论文件是否存在,都会先清空原有内容(不存在则创建空文件)。新创建的空文件调用readlines()会返回空列表,此时取[-1]必然触发IndexError。- 逻辑矛盾:就算文件原本存在,
w+会先清空内容,你根本读不到原来的最后一行。
修正方案
正确思路是:先尝试读取文件(只读模式),若文件不存在则创建并写入初始内容;若文件存在,再读取最后一行做判断。
方案一:捕获文件不存在异常(推荐)
HIGH_SCORES_FILE_PATH = "your_file_path.txt" try: # 先尝试读取文件 with open(HIGH_SCORES_FILE_PATH, "r") as file: lines = file.readlines() # 处理空文件情况 last_line = lines[-1] if lines else "" if last_line == '\n' or not last_line: # 追加写入初始内容 with open(HIGH_SCORES_FILE_PATH, 'a') as file: file.write('Jogo:\n') file.write(f'{0}\n') except FileNotFoundError: # 文件不存在时直接创建并写入初始内容 with open(HIGH_SCORES_FILE_PATH, "w") as file: file.write('Jogo:\n') file.write(f'{0}\n')
方案二:先检查文件是否存在
import os HIGH_SCORES_FILE_PATH = "your_file_path.txt" if os.path.exists(HIGH_SCORES_FILE_PATH): with open(HIGH_SCORES_FILE_PATH, "r") as file: lines = file.readlines() last_line = lines[-1] if lines else "" if last_line == '\n' or not last_line: with open(HIGH_SCORES_FILE_PATH, 'a') as file: file.write('Jogo:\n') file.write(f'{0}\n') else: with open(HIGH_SCORES_FILE_PATH, "w") as file: file.write('Jogo:\n') file.write(f'{0}\n')
额外优化:高效读取最后一行
如果文件很大,readlines()会加载整个文件到内存,效率极低,可改用以下方式只读取最后一行:
import os def get_last_line(file_path): with open(file_path, "rb") as file: # 从文件末尾倒读 file.seek(-2, os.SEEK_END) while file.read(1) != b'\n': try: file.seek(-2, os.SEEK_CUR) except OSError: file.seek(0) break last_line = file.readline().decode('utf-8') return last_line
用这个函数替代readlines()[-1],能避免大文件占用过多内存。
内容的提问来源于stack exchange,提问作者migas_silverio
相关产品推荐
相关产品推荐

