使用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] # 列表推导式
  1. 保存数据

    def load_data():
    with open(data_file, 'r', encoding='utf-8') as file:
    return json.load(file)
  2. 读取数据

    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() 函数自动创建文件:

  1. 'r' 模式(只读模式)下,如果文件不存在,会直接抛出 FileNotFoundError,不会自动创建文件。

  2. 只有使用'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文件中追加数据,需要用到一下方法:

  1. 采用读取→修改→覆盖写入的模式(而不是直接追加)

  2. 使用'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 实现数据本地持久化的更多相关文章

  1. python 内置方法、数据序列化

    abc(*args, **kwargs) 取绝对值 def add(a,b,f): return f(a)+f(b) res = add(3,-6,abs) print(res) all(*args, ...

  2. 几个可以提高工作效率的Python内置小工具

    在这篇文章里,我们将会介绍4个Python解释器自身提供的小工具.这些小工具在笔者的日常工作中经常用到,减少了各种时间的浪费,然而,却很容易被大家忽略.每当有新来的同事看到我这么使用时,都忍不住感叹, ...

  3. [python基础知识]python内置函数map/reduce/filter

    python内置函数map/reduce/filter 这三个函数用的顺手了,很cool. filter()函数:filter函数相当于过滤,调用一个bool_func(只返回bool类型数据的方法) ...

  4. Python内置函数解析

    我们知道,为了方便使用,python内置了一系列常用及关键的函数,如type().下面将对这些函数进行逐一分析.解释. Python内置函数表: 1. abs():返回绝对值.如abs(-1)= 1. ...

  5. Python内置函数(15)——memoryview

    英文文档: class memoryview(obj) memoryview objects allow Python code to access the internal data of an o ...

  6. Python内置函数(42)——memoryview

    英文文档: class memoryview(obj) memoryview objects allow Python code to access the internal data of an o ...

  7. 【转】python 内置函数总结(大部分)

    [转]python 内置函数总结(大部分) python 内置函数大讲堂 python全栈开发,内置函数 1. 内置函数 python的内置函数截止到python版本3.6.2,现在python一共为 ...

  8. python内置函数,匿名函数

    一.匿名函数 匿名函数:为了解决那些功能很简单的需求而设计的一句话函数 def calc(n): return n**n print(calc(10)) #换成匿名函数 calc = lambda n ...

  9. python 内置函数总结(大部分)

    python 内置函数大讲堂 python全栈开发,内置函数 1. 内置函数 python的内置函数截止到python版本3.6.2,现在python一共为我们提供了68个内置函数.它们就是pytho ...

  10. Python 内置函数sorted()在高级用法

    对于Python内置函数sorted(),先拿来跟list(列表)中的成员函数list.sort()进行下对比.在本质上,list的排序和内建函数sorted的排序是差不多的,连参数都基本上是一样的. ...

随机推荐

  1. 搭建 zerotier 的行星服务

    放弃moon节点,直接搭建Zerotier根服务器_软件应用_什么值得买 Zerotier的优点在于其部署十分简便,只需在zerotier官网注册登陆并创建网络,在自己的设备安装客户端加入网络后,ze ...

  2. 【C#】【平时作业】习题-7-继承、抽象与多态

    相关概念 什么是继承 继承定义了如何根据现有类创先新类的过程 任何类都可以从另外一个类继承 一个派生出来的子类具有这个类的所有公共属性和方法 类的继承机制 创建新类所根据的基础类称为基类或父类,新建的 ...

  3. 【YashanDB知识库】Oracle pipelined函数在YashanDB中的改写

    本文内容来自YashanDB官网,原文内容请见 https://www.yashandb.com/newsinfo/7802940.html?templateId=1718516 [问题分类]功能使用 ...

  4. IDEA批量实现CRLF转换成LF问题

    需要注意idea项目中右下角:选择LF,否则到时候部署到生产环境上会报错'\r\n'问题,之前的解决方案是 dos2unix 然后很多文件报这个问题,索性进行批量转换,但是很快拉去的新项目又会出现同样 ...

  5. tar/zip命令加密压缩

    回到顶部 场景 Centos6下使用加密压缩,可以从A机器到B机器解压. 可用在kali上解压就不行. 回到顶部 命令 解包 tar zxvf FileName.tar 打包 tar czvf Fil ...

  6. Macos 安装md5sum、sha1sum、md5deep、sha1deep

    一.安装md5sum和sha1sum 方法一:brew 安装 # brew install md5sha1sum 方法二:编译安装 源码下载地址:http://www.microbrew.org/to ...

  7. Qt/C++动态启用地图功能/地图拖曳/键盘操作/滚轮缩放/双击放大/连续缩放等

    一.前言说明 地图组件为了方便用户的操作,一般会满足各种需求场景,比如用鼠标拖曳地图,实体键盘按键上下左右移动,鼠标滚轮缩放地图大小,双击放大地图,这些常规的操作可以极大的方便用户操作,问题是,有时候 ...

  8. Qt音视频开发04-保存音频文件(pcm/wav/aac)

    一.前言 音频的保存相对来说比视频的要简单,具有通用性,不需要经过ffmpeg的编码,ffmpeg解码出来后一般会转换成pcm原始的数据用来播放,所以对数据直接写文件即可,但是这种格式是无法用播放器直 ...

  9. IM跨平台技术学习(十三):从理论到实践,详细对比Electron和Tauri的优劣

    本文由京东技术王泽知分享,原题"基于Web的跨平台桌面应用开发",下文进行了排版和内容优化. 1.引言 近些年来,跨平台跨端一直是比较热门的话题,Write once, run a ...

  10. IM群聊消息的已读未读功能在存储空间方面的实现思路探讨

    1.引言 IM系统中,特别是在企业应用场景下,消息的已读未读状态是一个强需求. 以阿里的钉钉为例,钉钉的产品定位是用于商务交流,其"强制已读回执"功能,让职场人无法再"假 ...