08_使用python 内置 json 实现数据本地持久化
使用python 内置 json 实现数据本地持久化
四个json函数
| 函数 | |
|---|---|
| json.load() | 将本地json数据文件读取出来,并以列表形式返回从文件对象中读取 JSON 格式的字符串,并将其反序列化为 Python 对象 |
| json.loads() | 将 JSON 格式的字符串反序列化为 Python 对象 |
| json.dump() | 将 Python 对象序列化为 JSON 格式的字符串,并将其写入文件对象。 |
| json.dumps() | 将 Python 对象序列化为 JSON 格式的字符串 |
将数据以json文件保存在本地的方式
使用file.open()
实例数据
class Person:
name = None
age = None
def __init__(self, name, age):
self.name = name
self.age = age
person1 = Person("Alice", 30)
person2 = Person("Bob", 25)
person3 = Person("Charlie", 35)
person4 = Person("David", 28)
person5 = Person("Eve", 32)
persons = [person1, person2, person3, person4, person5]
person_list = [person.__dict__ for person in persons]
print(person_list)
'''
[{'name': 'Alice', 'age': 30}, {'name': 'Bob', 'age': 25}, {'name': 'Charlie', 'age': 35}, {'name': 'David', 'age': 28}, {'name': 'Eve', 'age': 32}]
<class 'list'>
返回的是一个列表
'''
object.__dict__
object.__dict__是 Python 中的一个特殊属性,用于存储对象的实例属性。每个 Python 对象都有一个__dict__属性,它是一个字典,包含了对象的所有实例属性及其对应的值
将对象的数据保存到json中,需要先使用对象.__dict__将每一个对象的字典形式取出(使用列表推导式),在将每一个对象的字典形式保存在列表中,将列表保存在json文件中
data_list = [person.__dict__ for person in persons] # 列表推导式
保存数据
def load_data():
with open(data_file, 'r', encoding='utf-8') as file:
return json.load(file)
读取数据
def save_data(persons):
with open(data_file, 'w', encoding='utf-8') as file:
json.dump([person.__dict__ for person in persons], file, indent=2)
注意事项
open() 函数自动创建文件:
'r' 模式(只读模式)下,如果文件不存在,会直接抛出 FileNotFoundError,不会自动创建文件。
只有使用'w'(写入模式)或 'a'(追加模式)时,如果文件不存在,才会自动创建。
实际案例:
class HouseService:
house_list = []
data_file = os.path.join(os.path.dirname(__file__), 'house_data.json')
def __init__(self):
self.load_data()
if not self.house_list:
house1 = House('1', 'lihua', '123456', '郑州中原区', 800, '未出租')
house2 = House('2', 'jack', '123452', '郑州市二七区', 900, '未出租')
self.house_list.append(house1)
self.house_list.append(house2)
self.save_data() # 加载房屋数据
def load_data(self):
try:
with open(self.data_file, 'r', encoding='utf-8') as file:
data = json.load(file)
self.house_list = [House(**house) for house in data]
except FileNotFoundError:
self.house_list = [] # 保存房屋数据
def save_data(self):
with open(self.data_file, 'w', encoding='utf-8') as file:
json.dump([house.__dict__ for house in self.house_list], file, ensure_ascii=False, indent=4)
在此案例下,
load_data()函数如果不采用异常捕获的话,且文件夹中并没有house_data.json文件时,系统将直接抛出异常,当捕获异常之后,并初始化数据列表,程序可以继续向下进行,来到save_data()保存数据,并自动创建json文件所以在开发过程中,编写保存房屋数据时,注意异常捕获
追加数据
如果有新的数据需要保存,不能直接使用mode='a', 'a'模式追加写入,会导致JSON文件变成多个独立对象而不是有效数组,新追加的数据会直接保存在[]外面
[{...}, {...}] // 原始数据
{...} // 新追加数据(格式错误)
所以要向json文件中追加数据,需要用到一下方法:
采用读取→修改→覆盖写入的模式(而不是直接追加)
使用'w'模式保证每次写入完整的JSON数组结构
import os
import json # 示例数据
data = {
"name": "Alice",
"age": 30,
"skills": ["Python", "Docker"],
"is_active": True
} data_dile = os.path.join(os.path.dirname(__file__), 'person_data.json') def save_data(data):
with open(data_dile, 'w', encoding='utf-8') as file:
json.dump(data, file, indent=2) def load_data():
with open(data_dile, 'r', encoding='utf-8') as file:
data = json.load(file)
return data exist_data = load_data() # 取出现有数据
print(type(exist_data)) # <class 'list'>
exist_data.append(data) # 想列表中追加数据
save_data(exist_data) # 保存追加过数据后的列表
08_使用python 内置 json 实现数据本地持久化的更多相关文章
- python 内置方法、数据序列化
abc(*args, **kwargs) 取绝对值 def add(a,b,f): return f(a)+f(b) res = add(3,-6,abs) print(res) all(*args, ...
- 几个可以提高工作效率的Python内置小工具
在这篇文章里,我们将会介绍4个Python解释器自身提供的小工具.这些小工具在笔者的日常工作中经常用到,减少了各种时间的浪费,然而,却很容易被大家忽略.每当有新来的同事看到我这么使用时,都忍不住感叹, ...
- [python基础知识]python内置函数map/reduce/filter
python内置函数map/reduce/filter 这三个函数用的顺手了,很cool. filter()函数:filter函数相当于过滤,调用一个bool_func(只返回bool类型数据的方法) ...
- Python内置函数解析
我们知道,为了方便使用,python内置了一系列常用及关键的函数,如type().下面将对这些函数进行逐一分析.解释. Python内置函数表: 1. abs():返回绝对值.如abs(-1)= 1. ...
- Python内置函数(15)——memoryview
英文文档: class memoryview(obj) memoryview objects allow Python code to access the internal data of an o ...
- Python内置函数(42)——memoryview
英文文档: class memoryview(obj) memoryview objects allow Python code to access the internal data of an o ...
- 【转】python 内置函数总结(大部分)
[转]python 内置函数总结(大部分) python 内置函数大讲堂 python全栈开发,内置函数 1. 内置函数 python的内置函数截止到python版本3.6.2,现在python一共为 ...
- python内置函数,匿名函数
一.匿名函数 匿名函数:为了解决那些功能很简单的需求而设计的一句话函数 def calc(n): return n**n print(calc(10)) #换成匿名函数 calc = lambda n ...
- python 内置函数总结(大部分)
python 内置函数大讲堂 python全栈开发,内置函数 1. 内置函数 python的内置函数截止到python版本3.6.2,现在python一共为我们提供了68个内置函数.它们就是pytho ...
- Python 内置函数sorted()在高级用法
对于Python内置函数sorted(),先拿来跟list(列表)中的成员函数list.sort()进行下对比.在本质上,list的排序和内建函数sorted的排序是差不多的,连参数都基本上是一样的. ...
随机推荐
- Java线程 interrupt 方法使用异常
背景 需要在异步任务中中断任务的执行,故选择通过调用 interrupt 方法对线程设置中断信号. 在比较耗时的业务代码增加判断 Thread.currentThread().isInterrupte ...
- LNMP Wordpress phpMyAdmin的部署记录
背景 CentOS 8.2服务器,使用的虚拟服务器.只开放22与80端口.设置默认页面是wordpress的入口,phpmyadmin使用虚拟目录的形式进行访问. 安装 总体思路按照此文章进行.我进行 ...
- Qt音视频开发11-通用监控布局控件(开源)
一.前言 自从做监控系统以来,就一直有打算将这个功能独立出来一个类,这样的话很多系统用到此类布局切换,通用这个类就行,而且后期此布局会增加其他异形布局,甚至按照16:9之类的比例生成布局,之前此功能直 ...
- 内华达大地测量实验室gnss数据半自动化下载
内华达大地测量实验室GNSS数据半自动化下载 前言 目的:继上篇GNSS时序形变位移数据下载,介绍了内华达网站GNSS位移数据如何手动交互进行下载.后面发现若自己需要下载很多站点的数据,我要通过手动一 ...
- 在Quartz .NET的工作类中使用依赖注入
Quartz .NET默认的Execute方法是不支持非空的构造函数的,所以.net core常用的构造函数依赖注入也搞不来,网上搜索一番搞定了这个问题. 解决方案简单来说就是自定义一个任务工厂,替换 ...
- asp.net core Theme 中间件
asp.net core中自定义视图引擎,继承接口 IViewLocationExpander public class ThemeViewLocationExpander : IViewLocati ...
- [LC814]二叉树剪枝
题目 题目地址 分析 这道题符合递归的性质,对于当前的节点node,当且仅当其左右孩子都为不包含1的子树,且node.val=1时,node所在的子树才符合"不包含1的子树"这一定 ...
- linux-大数据常用命令
1. vi/vim一般模式语法 功能描述yy 复制光标当前一行y数字y 复制一段(从第几行到第几行)p 箭头移动到目的行粘贴u 撤销上一步dd 删除光标当前行d数字d 删除光标(含)后多少行x 删除一 ...
- 【刷题】牛客模拟面试 > 模拟面试报告
https://www.nowcoder.com/interview/ai/index 1-TCP协议的流量控制和拥塞控制 TCP的流量控制是基于窗口机制实现的: 在建立连接时, 发送方和接收方都会建 ...
- neo4j-图数据库
neo4j是图数据库 初识neo4j,首先我们要知道neo4j是图数据库.我们平常用的数据库一般是RDBMS(关系型数据库),那么什么是图数据库呢?既然有了关系型数据库,那么为什么要有图数据库呢? 1 ...