当前位置: 首页 > article >正文

python中序列化之json文件的使用

前言:

因为文件的读写只能进行字符串或比特类型的操作,其他类型只能转换为字符串或比特类型,想要使用时再转换回原来的类型,转换的过程非常复杂。而序列化和反序列化恰好可以很好的解决这个问题。

序列化和反序列化:

序列化就是将数据的信息或数据结构信息通过转换成字符串,以达到存储或传输的效果。

反序列化,顾名思义,就是将字符串转换为原来的类型。

可序列化的数据类型:

数字类型、字符串类型、列表类型、元组类型、字典类型【最常用】

注意:类、实例化对象,函数,集合是无法序列化的。【这点,java里类,实例化对象是可以序列化的啊?】

序列化模块--json模块与pickle模块:

json是通用的序列化模块,几乎所有的编程语言都有json模块,且序列化和反序列化的规则是统一的。因此,我们在python中通过json序列化的数据,在其他语言中都可以反序列化并使用。

json模块的函数

函数参数描述例子返回值
dumpsobj对象序列化json.dumps([1,2])字符串
loadsstr反序列化json.loads('[1,2]')原始数据类型

json是一种序列化的标准,通过json.dumps()函数对对象进行序列化后,对象会以固定的标准返回:

def json_xuliehua():
    b_json = json.dumps('str')
    print('json serialize:', b_json)
    c_json = json.dumps([1,2,3])
    print(c_json)
    d_json = json.dumps((4, 5, 6))
    print(d_json)
    # 字典通过序列化后,键值都用双引号包裹,中文转化成比特类型并编码
    e_json = json.dumps({'name':'xiao明', 'age': 12}) 
    print(e_json)

输出:

json serialize: "str"
[1, 2, 3]
[4, 5, 6]
{"name": "xiao\u660e", "age": 12}

同时,json也是一种文件格式,.json文件中的内容都是字典通过json序列化之后的内容。

例子:将字典通过json序列化后存入json文件,再从json文件中读取内容转换为字典

def write(path, data):
    with open(path, 'w') as f:
        if isinstance(data, dict):
            _data = json.dumps(data)
            f.write(_data)
    
        else:
            raise TypeError('data is not dict')

    return True


def read(path):
    with open(path, 'r') as f:
        result = f.read()
        result = json.loads(result)

    return result

data = {'name':'小明', 'age': 12, 'height': '165cm'}

if __name__ == '__main__':
    write('test.json', data)
    result = read('test.json')
    print(result)
    result['sex'] = 'boy'   # 对读取的内容操作,再次写入test.json
    write('test.json', result)
    result = read('test.json')
    print(result)

输出:

{'name': '小明', 'age': 12, 'height': '165cm'}
{'name': '小明', 'age': 12, 'height': '165cm', 'sex': 'boy'}
    

pickle模块的函数:

pickle模块只在python中使用,在其他语言可能无法处理

函数参数描述例子返回值
dumpsobj对象序列化pickle.dumps([1,2])比特
loadsbyte反序列化pickle.load('[1,2]')原始数据类型

注意:和json不同的是,pickle.dumps()返回的是比特类型,load()函数也只支持对比特类型进行反序列化。

思考:pickle模块的使用场景是哪些?可能是有中文的地方?

def pickle_1():
    data = {'name':'小明', 'age':17, 'height': '178cm'}
    _data = pickle.dumps(data)
    print(_data)
    dese = pickle.loads(_data)
    print(dese)

输出:
b'\x80\x04\x95-\x00\x00\x00\x00\x00\x00\x00}\x94(\x8c\x04name\x94\x8c\x06\xe5\xb0\x8f\xe6\x98\x8e\x94\x8c\x03age\x94K\x11\x8c\x06height\x94\x8c\x04178m\x94u.'
{'name': '小明', 'age': 17, 'height': '178m'}

如上,可知,pickle.dumps()函数可以让数据序列化为比特类型,方便在文件中传输比特类型的数据,又可以使用pickle.loads()函数反序列化为原来的数据类型,很方便实用。

进一步:pickle模块还有个load()函数,是处理序列化后的文件的,传参是文件,这个有时间可以研究下。


http://www.kler.cn/a/464104.html

相关文章:

  • 时序优化方法
  • Vue项目中生成node_modules文件夹的两种常用方法及npm优势
  • 景区自助售卡机与定点酒店的合作双赢之策-景区酒店方案
  • Ansys Discovery 中的网格划分方法:探索模式
  • 直观解读 JuiceFS 的数据和元数据设计(一)
  • 国产编辑器EverEdit - 常用资源汇总
  • Redis 发布订阅(Pub/Sub)机制详解
  • Switch组件的用法
  • 《我在技术交流群算命》(二):QGraphicsItem怎么写自定义信号啊(QObject多继承顺序问题)
  • 深入解析 JVM vs JDK vs JRE:三者区别与联系详解
  • python opencv的orb特征检测(Oriented FAST and Rotated BRIEF)
  • LevelDB 源码阅读:利用 Clang 的静态线程安全分析
  • 彻底解决 Selenium ChromeDriver 不匹配问题:Selenium ChromeDriver 最新版本下载安装教程
  • 概率论与数理统计
  • 需求上线,为什么要刷缓存?
  • LeetCode算法题——长度最小的子数组
  • 大模型的prompt的应用一
  • 数据挖掘——集成学习
  • Java-写一个计数器
  • mac下载Homebrew安装nvm
  • 微服务间通信的端口开放性探究:从单机到多机的转变
  • <<零基础学C++,类和对象(上)--类的定义,访问限定符,类域,实例化>>
  • 第11章 汇编语言--- 内存模型概述
  • 文件本地和OSS上传
  • 虚拟机中的时统卡功能和性能调优
  • AI 驱动研发模式升级,蓝凌软件探索效率提升之道