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

Python读取JSON文件报错Expecting value: line1 column1,求排查解决

解决JSON解析错误:Expecting value: line 1 column 1 (char 0)

这个错误的核心原因是你读取的JData.json文件内容为空,根源出在子进程的处理逻辑上:

你启动subprocess.Popen后,立刻调用了F.close()关闭文件,但此时子进程可能还没完成输出写入操作——Popen是非阻塞的,启动后会直接返回,不会等待子进程结束。这就导致文件要么是空的,要么只写入了不完整的内容,JSON解析器自然无法识别,抛出"Expecting value"错误。

修正方案

方案1:等待子进程执行完毕再关闭文件

在关闭文件前,调用proc.wait()等待子进程完成所有输出写入:

import subprocess
import json

JFile = "JData.json"
F = open(JFile, "w", encoding='utf-8')
try:
    proc = subprocess.Popen([MyCMD], shell=True, encoding='utf-8', stdout=F)
    proc.wait()  # 阻塞直到子进程执行完成
except Exception as ex:
    print("ERROR: CMD Failed....", ex)
finally:
    F.close()  # 确保文件一定会被关闭

try:
    with open(JFile, 'r', encoding='utf-8') as J:
        JData = json.load(J)  # 直接用json.load更简洁
except json.decoder.JSONDecodeError as e:
    print("invalid json", e)

方案2:使用subprocess.run()(推荐)

Python 3.5+推荐使用subprocess.run(),它是阻塞式的,会自动等待子进程完成,且语法更简洁,还能通过check=True捕获命令执行失败的情况:

import subprocess
import json

JFile = "JData.json"
try:
    # 用with语句管理文件,无需手动close
    with open(JFile, "w", encoding='utf-8') as F:
        subprocess.run([MyCMD], shell=True, encoding='utf-8', stdout=F, check=True)
except subprocess.CalledProcessError as ex:
    print("ERROR: CMD Failed with non-zero exit code....", ex)
except Exception as ex:
    print("ERROR: CMD Failed....", ex)

try:
    with open(JFile, 'r', encoding='utf-8') as J:
        JData = json.load(J)
except json.decoder.JSONDecodeError as e:
    print("invalid json", e)

额外优化点

  • 读取JSON时,直接使用json.load(J)代替json.loads(J.read()),代码更简洁,还能避免手动读取文件时可能出现的编码或EOF问题。
  • 始终用with语句管理文件句柄,Python会自动在代码块结束时关闭文件,避免资源泄漏。

内容的提问来源于stack exchange,提问作者Salton

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 00:25:50