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

Python中json.dump()写入JSON文件异常原因及修复方法咨询

JSON文件追加数据异常的原因与修复方案

问题描述

我理解json.dump()的作用是将变量以JSON格式写入文件。操作员工信息JSON文件的代码能正常在emp_details数组中追加新数据,但逻辑类似的鼓励语JSON文件操作代码却出现写入异常,文件内容错乱。期望在encouragements数组中追加元素,实际结果出现多余内容。

正常运行的员工信息操作代码

import json 

def write_json(new_data, file_name="data/emp_details.json"): 
    with open(file_name, 'r+') as f: 
        file_data = json.load(f)
        file_data["emp_details"].append(new_data)
        print(file_data)
        f.seek(0)
        json.dump(file_data, f, indent=2)

new_data = {"emp_name": "Nikhil", 
            "email": "nikhil@geekforgeeks.org", 
            "job_profile": "Full Time"}

write_json(new_data)

运行前emp_details.json:

{
  "emp_details": [
    {
      "emp_name": "Shubham",
      "email": "ksingh.shubh@gmail.com",
      "job_profile": "intern"
    },
    {
      "emp_name": "Gaurav",
      "email": "gaurav.singh@gmail.com",
      "job_profile": "developer"
    }
}

运行后emp_details.json(正常):

{
  "emp_details": [
    {
      "emp_name": "Shubham",
      "email": "ksingh.shubh@gmail.com",
      "job_profile": "intern"
    },
    {
      "emp_name": "Gaurav",
      "email": "gaurav.singh@gmail.com",
      "job_profile": "developer"
    },
    {
      "emp_name": "Nikhil",
      "email": "nikhil@geekforgeeks.org",
      "job_profile": "Full Time"
    }
}

出现异常的鼓励语操作代码

with open("data/encouraging_message.json", "r+") as f:
    f.seek(0)
    data = f.read()
    # print(data)
    if data == "":
        file_structure = {"encouragements": [encouraging_message]}
        # print(file_structure)
        json.dump(file_structure, f, indent=2)
    else:
        f.seek(0)
        data = json.load(f)
        # print(data)
        print(data["encouragements"])
        data["encouragements"].append(encouraging_message)
        print(data["encouragements"])
        print(data)
        f.seek(0)
        json.dump(data, f, indent=2)

原encouraging_message.json:

{
  "encouragements": [
    "You will be fine!",
    "You will be fine!"
  ]
}

期望结果:

{
  "encouragements": [
    "You will be fine!",
    "You will be fine!", 
    "You will be fine!"
  ]
}

实际错误结果:

{
  "encouragements": [
    "You will be fine!",
    "You will be fine!"
  ]
}"You will be fine!"
  ]
}

异常原因

使用r+模式打开文件时,写入操作不会自动截断原有文件内容。如果新写入的JSON字符串长度小于原文件的字节数,原文件中未被覆盖的部分会残留并追加在新内容之后,导致JSON格式错乱。

第一个员工信息操作代码之所以正常,是因为追加后的JSON内容长度大于原文件,完全覆盖了旧内容;而鼓励语操作代码中,新生成的JSON内容长度未完全覆盖原文件,导致旧内容的部分字符残留,最终出现格式错误。

修复方法

有两种可靠的修复方式:

方式一:写入前截断文件

在调用json.dump()前,使用f.truncate()清除文件原有内容,确保写入的新内容是唯一的文件内容。

方式二:分开读写文件

先以只读模式读取文件内容,修改后再以写入模式打开文件(自动覆盖原有内容)完成写入。

修正后的代码

方式一(截断文件)

with open("data/encouraging_message.json", "r+") as f:
    f.seek(0)
    data = f.read()
    encouraging_message = "You will be fine!"  # 补充变量定义
    if data == "":
        file_structure = {"encouragements": [encouraging_message]}
        json.dump(file_structure, f, indent=2)
    else:
        f.seek(0)
        data = json.load(f)
        data["encouragements"].append(encouraging_message)
        f.seek(0)
        f.truncate()  # 关键:截断文件
        json.dump(data, f, indent=2)

方式二(分开读写)

encouraging_message = "You will be fine!"  # 补充变量定义
# 读取文件内容
with open("data/encouraging_message.json", "r") as f:
    try:
        data = json.load(f)
    except json.JSONDecodeError:  # 处理空文件情况
        data = {"encouragements": []}

# 修改数据
data["encouragements"].append(encouraging_message)

# 写入文件(自动覆盖原有内容)
with open("data/encouraging_message.json", "w") as f:
    json.dump(data, f, indent=2)

验证结果

修复后运行代码,encouraging_message.json将得到期望的正确格式:

{
  "encouragements": [
    "You will be fine!",
    "You will be fine!",
    "You will be fine!"
  ]
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 02:22:08