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

