Python 序列化 (Pickle/Json/Msgpack)

本文介绍了Python中的序列化库,包括Pickle、Json和Msgpack。讨论了它们的基本概念、库函数、数据类型转换、常用方法以及示例。还对这三种序列化方式进行对比,并进行了实际的序列化实验,揭示了序列化和反序列化的原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、定义

  • serialization 序列化:要设计一套协议,按照某种规则,把内存中数据保存到文件中。文件是一个字节序列,所以必须把数据转换成字节序列,输出到文件。这就是序列化。
  • deserialization 反序列化:反之,从文件的字节序列恢复到内存中并且还原原来的类型,就是反序列化。
  • 序列化保存到文件就是持久化。可以将数据序列化后持久化,或者网络传输;也可以将从文件中或者网络接收到的字节序列反序列化。

2、pickle

  • pickle 库是 Python 中的序列化/反序列化模块
  • pickle 库不推荐使用,序列化后所占空间比较大,不利于网络传输和硬盘存储,但是便于大家理解序列化和反序列化原理

2.1 pickle 库函数方法

在这里插入图片描述

2.2 dump 和 load 示例

  • 序列化字符 'a'

    In [259]: import pickle
    In [260]: from pathlib import Path
    
    In [261]: chr(97)
    Out[261]: 'a'
    
    In [268]: hex(97)
    Out[268]: '0x61'
    
    In [262]: i = 'a'
    
    In [263]: filename = Path('ser.txt')
    
    In [266]: with open(filename, 'rb+') as f:
         ...:     print(f.read())
         ...:     f.seek(0, 0)
         ...:     x = pickle.load(f)
         ...:     print(x, type(x))
         ...: 
    b'\x80\x04\x95\x05\x00\x00\x00\x00\x00\x00\x00\x8c\x01a\x94.'
    a <class 'str'>
    
    # 十六进制 查看 序列化 后的文件
    [root@Sybil sybil]#hexdump ser.txt 
    0000000 0480 0595 0000 0000 0000 8c00 6101 2e94
    0000010
    
  • 序列化数字 97

    In [269]: i = 97
    
    In [270]: filename = Path('ser.txt')
    
    In [271]: with open(filename, 'wb+') as f:
         ...:     pickle.dump(i, f)
         ...: 
    
    In [272]: with open(filename, 'rb+') as f:
         ...:     print(f.read())
         ...:     f.seek(0, 0)
         ...:     x = pickle.load(f)
         ...:     print(x, type(x))
         ...: 
         ...: 
    b'\x80\x04Ka.'
    97 <class 'int'>
    
    # 十六进制 查看 序列化 后的文件
    [root@Sybil sybil]#hexdump ser.txt 
    0000000 0480 614b 002e                         
    0000005
    
  • 序列化字符 ’97‘

    In [273]: i = '97'
    
    In [274]: filename = Path('ser.txt')
    
    In [275]: with open(filename, 'wb+') as f:
         ...:     pickle.dump(i, f
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值