Python高效管理JSON文件:读写、更新、删除全攻略
liuian 2024-12-22 19:36 28 浏览
引言:
代码对 JSON 文件的常见操作(读取、写入、追加、删除、更新)的封装,每个方法都对常见的异常情况进行了处理,并且提供了详细的错误提示,失败的原因。
代码封装如下:
import json #todo 导入json模块用于处理json数据
class JsonFileHandler:
#todo 初始化函数,传入文件路径作为实例变量
def __init__(self, file_path):
self.file_path = file_path #todo 文件路径存储在实例变量self.file_path中
#todo 读取json文件并返回内容
def read_json(self):
try:
with open(self.file_path, 'r', encoding='utf-8') as file: #todo 以读取模式打开文件,确保使用utf-8编码
data = json.load(file) #todo 将文件内容加载为Python字典对象
return data #todo 返回读取到的数据
except FileNotFoundError: #todo 如果文件未找到
print(f"Error: {self.file_path} not found.") #todo 输出错误信息
return None #todo 返回None表示读取失败
except json.JSONDecodeError: #todo 如果文件内容不是有效的json格式
print(f"Error: {self.file_path} is not a valid JSON file.") #todo 输出格式错误信息
return None
#todo 将数据写入json文件
def write_json(self, data):
try:
with open(self.file_path, 'w', encoding='utf-8') as file: #todo 以写模式打开文件
json.dump(data, file, indent=4, ensure_ascii=False) #todo 将数据写入文件,格式化输出并保留中文字符
print(f"Data successfully written to {self.file_path}.") #todo 提示成功写入
except Exception as e: #todo 捕获其他可能的异常
print(f"Error writing to file {self.file_path}: {e}") #todo 输出异常信息
#todo 向json文件中追加数据
def append_to_json(self, data):
try:
#todo 打开文件读取数据,如果文件存在则读取,如果文件不存在则创建新文件
with open(self.file_path, 'r+', encoding='utf-8') as file:
try:
exist_data = json.load(file) #todo 尝试读取已有数据
except json.JSONDecodeError: #todo 如果文件为空或格式错误,初始化为空列表
exist_data = []
exist_data.append(data) #todo 将新数据添加到已有数据中
file.seek(0) #todo 将文件指针移到文件开头
json.dump(exist_data, file, indent=4, ensure_ascii=False) #todo 写回数据,格式化输出
file.truncate() #todo 截断文件,以确保多余内容被删除
print(f"Data successfully appended to {self.file_path}.") #todo 提示成功追加
except FileNotFoundError: #todo 如果文件不存在
with open(self.file_path, 'w', encoding='utf-8') as file: #todo 创建新文件
json.dump([data], file, indent=4, ensure_ascii=False) #todo 将数据写入新文件
print(f"File not found. New file created and data added to {self.file_path}.") #todo 提示创建新文件并添加数据
#todo 从json文件中删除指定的key
def delete_from_json(self, key):
try:
with open(self.file_path, 'r', encoding='utf-8') as file: #todo 打开文件读取数据
data = json.load(file) #todo 读取json数据
except FileNotFoundError: #todo 如果文件不存在
print(f"Error: {self.file_path} not found.") #todo 输出错误信息
return
except json.JSONDecodeError: #todo 如果文件内容格式错误
print(f"Error: {self.file_path} is not a valid JSON file.") #todo 输出格式错误信息
return
if key in data: #todo 如果字典中存在指定的key
del data[key] #todo 删除指定的key
with open(self.file_path, 'w', encoding='utf-8') as file: #todo 以写模式打开文件
json.dump(data, file, indent=4, ensure_ascii=False) #todo 将更新后的数据写回文件
print(f"Key '{key}' successfully deleted from {self.file_path}.") #todo 提示成功删除
else:
print(f"Key '{key}' not found in the file.") #todo 如果key不存在,输出提示信息
#todo 更新json文件中指定key的值
def update_json(self, key, new_value):
try:
with open(self.file_path, 'r', encoding='utf-8') as file: #todo 打开文件读取数据
data = json.load(file) #todo 读取json数据
except FileNotFoundError: #todo 如果文件不存在
print(f"Error: {self.file_path} not found.") #todo 输出错误信息
return
except json.JSONDecodeError: #todo 如果文件内容格式错误
print(f"Error: {self.file_path} is not a valid JSON file.") #todo 输出格式错误信息
return
if key in data: #todo 如果字典中存在指定的key
data[key] = new_value #todo 更新该key的值
with open(self.file_path, 'w', encoding='utf-8') as file: #todo 以写模式打开文件
json.dump(data, file, indent=4, ensure_ascii=False) #todo 将更新后的数据写回文件
print(f"Key '{key}' successfully updated to '{new_value}'.") #todo 提示成功更新
else:
print(f"Key '{key}' not found in the file.") #todo 如果key不存在,输出提示信息
#todo 主程序入口
if __name__ == '__main__':
#todo 示例:初始化JsonFileHandler对象并进行相关操作
file_path = r"D:\AASEXCHDATE.json" #todo 定义json文件路径
json_handler = JsonFileHandler(file_path) #todo 创建JsonFileHandler实例
#todo 读取文件内容并输出
data = json_handler.read_json()
if data is not None:
print(data)
#todo 写入新的数据
json_handler.write_json(data={'index': 'hello'})
#todo 追加数据
json_handler.append_to_json(data={'new_key': 'new_value'})
#todo 删除指定key的数据
json_handler.delete_from_json(key='index')
#todo 更新指定key的数据
json_handler.update_json(key='new_key', new_value='updated_value')
说明:
其实json文件是可以与之前说过的yaml文件来结合使用的:
JSON 通常用于数据交换,而 YAML 更具可读性,适合配置文件等用途。如果需要在同一个项目中同时使用 JSON 和 YAML 文件,可能是由于不同场景的需求,或者需要将它们结合起来做一些特定的处理。 这个我们后面会出一篇文章来稍微讲解一下
相关推荐
- C语言学习从内存堆栈视角,给这段枚举代码做个 "内存透视"
-
从内存堆栈视角,给这段枚举代码做个"内存透视"#include<stdio.h>enumDAY{MON=1,TUE,WED,THU,FR...
- Python基础:枚举,都有哪些特点和使用场景呢?
-
在Python编程语言中,枚举(Enumeration)是一种特殊的类,用于为一组常量创建一个名称空间。枚举类在Python3.4中被引入,提供了一种更加直观和方便的方式来处理一组相关的常量。枚举类...
- Java枚举你真的会用吗_java枚举怎么使用
-
概述Java中枚举,大家在项目中经常使用吧,主要用来定义一些固定值,在一个有限的集合内,比如在表示一周的某一天,一年中的四季等。那你了解枚举的本质吗?了解枚举的一些常见用法吗?枚举介绍和使用枚举主要用...
- 反射、枚举以及Lambda表达式_反射getmethod
-
一、反射1.定义Java的反射(reflection)机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法(即使是私有的);对于任意一个对象,都能够调用它的任意方法和属性,那么,我们就...
- 一个高效使用cursor开发项目的方法,怎么让 AI 写的代码不跑题?
-
最近又用cursor做了一个小应用,番茄时钟,用来管理自己的时间,提高效率。然后使用cursor开发的过程中。有了一些新的感悟。找到了一条可以让Curosr不跑题的办法。生成一份详细的项目资...
- 前端铜九铁十面试必备八股文——工程化
-
常用的git命令gitclone:克隆远程仓库到本地。gitinit:在当前目录初始化一个新的Git仓库。gitadd:将文件添加到暂存区,准备提交。gitcommit-m"co...
- IntelliJ IDEA 2025.2 的主要更新亮点
-
以下是该版本的一些关键改进与功能更新:AI增强体验离线Java代码补全:AI助手现在支持在离线模式下进行Java代码块建议,并允许用户选择本地代码模型使用。AIAssistant新增...
- 一行命令,AI 直接写代码!OpenAI 正式发布 Codex CLI
-
【一句话速读】OpenAI把2021年的Codex品牌复活,推出全新CodexCLI——一个本地运行的轻量级编码代理。只需npmi-g@openai/codex,它就能在终端里帮...
- 如何使用高级TypeScript模式构建可扩展的QA框架
-
TypeScript自动化QA(7部分系列)TypeScript第一步:自动化QA实用路线图如何在TypeScript中使用数组和对象构建强大的QA自动化脚本如何掌握TypeScript基础...
- Bun JS工具包新增MySQL驱动和密钥管理功能
-
Bun团队发布了其JavaScript打包器和运行时的1.2.21版本,该工具使用Zig语言编写,新增了包括MySQL和SQLite内置驱动、YAML解析器以及用于工具和本地开发的密钥管理器等功能。新...
- 编码 10000 个小时后,开发者悟了:“不要急于发布!”
-
【CSDN编者按】在软件开发的道路上,时间是最好的老师。根据“一万小时定律”,要成为某个领域的专家,通常需要大约一万小时的刻意练习。本文作者身为一名程序员,也经历了一万小时的编程,最终悟出了一个道理...
- 一文说明,TypeScript 的装饰器_typescript logo
-
●装饰器(Decorators)●注意:装饰器目前是一项实验性特性,在未来的版本中可能会发生改变●装饰器一般使用在以下几个地方○类○类属性○类方法○类方法的参数○通过这些我们也能看得出来,...
- 前端小哥哥:如何使用typescript开发实战项目?
-
前言笔者上一篇文章:主要写了typescript的用法和核心知识点总结,这篇文章将通过一个实际的前端案例来教大家如何在项目中使用typescript.你将收获如何使用umi快速搭建一个基于React...
- 一篇文章搞懂TypeScript_typescript implements
-
TypeScript是JavaScript的超集,一方面给动态类型的js增加了类型校验,另一方面扩展了js的各种功能。原始数据类型字符串数值布尔nullundefinedSymbolBi...
- TypeScript的any和unknown,用错一个就是线上Bug
-
在TypeScript开发中,类型系统是我们抵御运行时错误的第一道防线。但两个特殊类型——any和unknown,却常常被误用,成为线上故障的隐形推手。本文通过真实案例解析,告诉你为什么unknown...
- 一周热门
-
-
Python实现人事自动打卡,再也不会被批评
-
【验证码逆向专栏】vaptcha 手势验证码逆向分析
-
Psutil + Flask + Pyecharts + Bootstrap 开发动态可视化系统监控
-
一个解决支持HTML/CSS/JS网页转PDF(高质量)的终极解决方案
-
再见Swagger UI 国人开源了一款超好用的 API 文档生成框架,真香
-
网页转成pdf文件的经验分享 网页转成pdf文件的经验分享怎么弄
-
C++ std::vector 简介
-
飞牛OS入门安装遇到问题,如何解决?
-
系统C盘清理:微信PC端文件清理,扩大C盘可用空间步骤
-
10款高性能NAS丨双十一必看,轻松搞定虚拟机、Docker、软路由
-
- 最近发表
- 标签列表
-
- python判断字典是否为空 (50)
- crontab每周一执行 (48)
- aes和des区别 (43)
- bash脚本和shell脚本的区别 (35)
- canvas库 (33)
- dataframe筛选满足条件的行 (35)
- gitlab日志 (33)
- lua xpcall (36)
- blob转json (33)
- python判断是否在列表中 (34)
- python html转pdf (36)
- 安装指定版本npm (37)
- idea搜索jar包内容 (33)
- css鼠标悬停出现隐藏的文字 (34)
- linux nacos启动命令 (33)
- gitlab 日志 (36)
- adb pull (37)
- python判断元素在不在列表里 (34)
- python 字典删除元素 (34)
- vscode切换git分支 (35)
- python bytes转16进制 (35)
- grep前后几行 (34)
- hashmap转list (35)
- c++ 字符串查找 (35)
- mysql刷新权限 (34)