💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
[TOC] ## 序列化概念 ### 什么叫序列化? 序列化是指把内存里的数据类型转变成字符串,以使其能存储到硬盘或通过网络传输到远程,因为硬盘或网络传输时只能接受bytes ### 序列化模块 用于序列化的两个模块 * json:用于字符串 和 python数据类型间进行转换 * pickle:用于python特有的类型和python的数据类型间进行转换 * shelv:简单的k,v类型持久化的模块,可持久化任何pickle支持的python数据格式 Json和pickle模块都提供了四个功能:dumps、dump、loads、load ### 序列化和反序列化 * dumps 和 dump序列化方法: dumps只完成了序列化为str; dump必须传文件描述符,将序列化的str保存到文件中 * loads和load反序列化方法: loads 只完成了反序列化; load 只接收文件描述符,完成了读取文件和反序列化 ### json、pickle对比: * **JSON:** 优点:跨语言、体积小 缺点:只能支持int、str、list、tuple、dict * **Pickle:** 优点:专为python设计,支持python所有的数据类型 缺点:只能在python中使用,存储数据占空间大 ## 序列化操作举例 ### pickle模块举例 ``` import pickle data = {'k1':123,'k2':'Hello'} # pickle.dumps 将数据通过特殊的形式转换为只有python语言认识的字符串 p_str = pickle.dumps(data) print('直接打印:',p_str) #pickle.dump 将数据通过特殊的形式转换位只有python语言认识的字符串,并写入文件 with open('t.txt','wb+') as fp: pickle.dump(data,fp) fp.seek(0) print('存后打印:',fp.read()) #输出结果 直接打印: b'\x80\x03}q\x00(X\x02\x00\x00\x00k1q\x01K{X\x02\x00\x00\x00k2q\x02X\x05\x00\x00\x00Helloq\x03u.' 存后打印: b'\x80\x03}q\x00(X\x02\x00\x00\x00k1q\x01K{X\x02\x00\x00\x00k2q\x02X\x05\x00\x00\x00Helloq\x03u.' ``` ### json模块举例 ``` import json data = {'k1':123,'k2':'Hello'} # json.dumps 将数据通过特殊的形式转换位所有程序语言都认识的字符串 j_str = json.dumps(data) print('直接打印:',j_str) #json.dump 将数据通用的json格式字符串,并写入文件 with open('t.txt','w+',encoding='utf-8') as fp: json.dump(data,fp) fp.seek(0) print('存后打印:',fp.read()) #输出结果 直接打印: {"k1": 123, "k2": "Hello"} 存后打印: {"k1": 123, "k2": "Hello"} ``` ## shelve模块举例 前两个模块都可以序列化为字符串后序列化存储到文件中并反序列化出来,但shelve模块只能序列化到文件和反序列化出来,不能直接序列化为字符串 ### shelve序列化: ``` import shelve names = ["alex", "rain", "test"] info = {'name':'alex','age':22} f = shelve.open('tt.txt') # 打开一个文件 f["names"] = names # 持久化列表 f['info_dic'] = info f.close() ``` ### shelve反序列化: ``` import shelve d = shelve.open('tt.txt') # 打开一个文件 print('name:',d['names']) print('info:',d['info_dic']) del d['test'] #还可以删除 # 输出结果 name: ['alex', 'rain', 'test'] info: {'name': 'alex', 'age': 22} ``` * 其他 用shelve打开文件后,还可以删除序列化后的某些内容。 `del d['info_dic']`