Python内置json实现数据本地持久化详解

 更新时间:2025年03月05日 10:00:52   作者:静香还需努力  
这篇文章主要为大家详细介绍了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) # 保存追加过数据后的列表

到此这篇关于Python内置json实现数据本地持久化详解的文章就介绍到这了,更多相关Python数据本地持久化内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python+django+mysql开发实战(附demo)

    python+django+mysql开发实战(附demo)

    本文主要介绍了python+django+mysql开发实战(附demo),文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • python中start和run方法的区别

    python中start和run方法的区别

    大家好,本篇文章主要讲的是python中start和run方法的区别,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02
  • Python定时器实例代码

    Python定时器实例代码

    这篇文章主要介绍了Python定时器实例代码,向大家分享了两部分代码示例,一个是通过线程实现定时器timer,另一个是Python实现的精度可调的定时器实例,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • python绘制玫瑰花情人节表白

    python绘制玫瑰花情人节表白

    这篇文章主要介绍了python绘制玫瑰花,文章基于python的相关资料展开主题详细介绍,具有一定的参考价值,想情人节花式表白的小伙伴可以参考一下哟
    2022-06-06
  • Python matplotlib绘制饼状图功能示例

    Python matplotlib绘制饼状图功能示例

    这篇文章主要介绍了Python matplotlib绘制饼状图功能,结合实例形式分析了Python使用matplotlib模块进行数值运算与饼状图绘制相关操作技巧,需要的朋友可以参考下
    2019-09-09
  • 利用OpenCV进行对象跟踪的示例代码

    利用OpenCV进行对象跟踪的示例代码

    这篇文章主要介绍了如何使用OpenCV中内置的八种不同的对象跟踪算法,实现对物体的跟踪。文中的示例代码讲解详细,感兴趣的可以了解一下
    2022-02-02
  • pygame实现井字棋之第二步逻辑实现

    pygame实现井字棋之第二步逻辑实现

    这篇文章主要介绍了pygame实现井字棋之第二步逻辑实现,文中有非常详细的代码示例,对正在学习python的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-05-05
  • Python从列表推导到zip()函数的5种技巧总结

    Python从列表推导到zip()函数的5种技巧总结

    在本篇文章里小编给大家整理的是关于Python从列表推导到zip()函数的5种技巧的相关知识点和代码,需要的朋友们参考学习下。
    2019-10-10
  • ConvNeXt实战之实现植物幼苗分类

    ConvNeXt实战之实现植物幼苗分类

    ConvNeXts由标准ConvNet模块构建,在准确性和可扩展性方面与 Transformer竞争,实现87.8% ImageNet top-1 准确率,在 COCO 检测和 ADE20K 分割方面优于 Swin Transformers。本文将利用ConvNeXt实现植物幼苗分类,需要的可以参考一下
    2022-01-01
  • 在python环境下运用kafka对数据进行实时传输的方法

    在python环境下运用kafka对数据进行实时传输的方法

    今天小编就为大家分享一篇在python环境下运用kafka对数据进行实时传输的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12

最新评论