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
相关产品推荐
相关产品推荐

