Python读取JSON文件首次运行或内容为空时崩溃的解决方法
问题原因
- 空文件不符合JSON语法要求,调用
json.load()解析时会抛出json.JSONDecodeError异常,直接导致程序崩溃 - 首次运行程序时,还可能遇到
receipts.json文件不存在的情况,触发FileNotFoundError,原代码未做对应兼容 - 原代码中手动调用
file_receipts.close()是多余操作:with语句打开的文件会在代码块执行结束后自动关闭,不需要手动处理。
优化代码
核心处理逻辑是提前判断文件状态、捕获解析异常,遇到文件不存在、为空、内容非法的场景时,自动初始化空的收据字典,同时将合法的空JSON结构写入文件,避免后续运行重复报错。
import json import os receipts = {} receipt_file_path = "receipts.json" try: # 先校验文件存在且文件大小大于0,再执行读取解析 if os.path.exists(receipt_file_path) and os.path.getsize(receipt_file_path) > 0: with open(receipt_file_path, "r", encoding="utf-8") as f: receipts = json.load(f) else: # 文件不存在/为空时,写入空字典作为初始合法JSON内容 with open(receipt_file_path, "w", encoding="utf-8") as f: json.dump(receipts, f, ensure_ascii=False, indent=2) except json.JSONDecodeError: # 文件存在但内容不是合法JSON时,重置为空字典并覆盖修复文件 receipts = {} with open(receipt_file_path, "w", encoding="utf-8") as f: json.dump(receipts, f, ensure_ascii=False, indent=2)
优化点说明
- 覆盖了所有会导致加载崩溃的场景:文件不存在、文件为空、文件内容为非法JSON格式
- 异常场景下会自动修复JSON文件内容,写入合法的空字典结构,后续程序运行可以正常读写
- 移除了冗余的手动关闭文件逻辑,完全依托
with上下文管理器管理文件资源 - 读写时统一指定
utf-8编码,避免Windows系统默认GBK编码导致的乱码问题 - 写入JSON时开启
ensure_ascii=False和缩进格式化,生成的文件可读性更强,中文内容不会被转义为Unicode编码
内容的提问来源于stack exchange,提问作者Zethus
相关产品推荐
相关产品推荐

