Python JSON文件处理报错排查:Telegram监控Bot首次启动问题
解决JSONDecodeError:首次启动时正确初始化ping_data.json文件
你遇到的json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)错误,确实是因为首次启动时ping_data.json文件不存在或者是空文件,json.load()无法解析空内容导致的。下面是具体的修复方案,同时优化代码中潜在的其他问题:
1. 修复文件读取逻辑,处理空/不存在的JSON文件
你的代码一开始直接尝试读取文件,没有处理文件不存在或为空的情况。我们可以通过检查文件状态+异常捕获来解决这个问题,同时修正路径的转义问题:
import os import json # 初始化变量,避免后续引用报错 ping_data = dict() data = dict() # 使用原始字符串定义路径,避免Windows下的转义问题 json_file_path = r'C:\ping_data.json' # 处理JSON文件读取逻辑 if os.path.exists(json_file_path) and os.path.getsize(json_file_path) > 0: try: with open(json_file_path, 'r') as file: data = json.load(file) except json.JSONDecodeError: # 如果文件内容不是合法JSON,同样初始化空字典 print("JSON文件内容损坏,将使用空状态") data = dict() else: # 文件不存在或为空,初始化空字典 print("首次启动,初始化空的状态文件") data = dict() # 将读取到的历史状态同步到ping_data ping_data.update(data)
2. 修复ping_host函数中的键引用问题
你原来的代码中data['address.address']是错误的——address.address是变量,不是字符串键,直接这样写会导致KeyError(首次启动时字典为空,没有这个字符串键)。修改后的ping_host函数如下:
def ping_host(address): status = ping_url(address.address) # 用get方法安全获取历史状态,默认值为None(首次检查无记录) previous_status = data.get(address.address, None) if previous_status != status: # 更新当前状态到ping_data ping_data[address.address] = status # 构造消息前缀 prefix = "! " if status is None else "+ " if status else "- " send_message(f"{prefix}{address.comment}") # 同步更新data字典,避免循环内使用旧状态 data[address.address] = status
3. 验证首次启动流程
修改后,首次启动时:
- 程序会检查到
ping_data.json不存在或为空,自动初始化空的data和ping_data字典 - 第一次执行ping后,会将状态写入
ping_data.json,生成合法的JSON文件 - 后续重启时,就能正常从文件读取历史状态了
这样既解决了首次启动的崩溃问题,也优化了代码的健壮性,避免了潜在的KeyError和路径转义问题。
内容的提问来源于stack exchange,提问作者Alexandr
相关产品推荐
相关产品推荐

