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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 19:22:59