什么是序列化
什么是序列化,把程序中的对象或者变量,从内存中转换为可存储或可传输的过程称为序列化。在 Python 中,这个过程称为 pickling,在其他语言中也被称为 serialization,marshalling,flattening 等。程序中的对象(或者变量)在序列化之后,就可以直接存放到存储设备上,或者直接发送到网络上进行传输。
序列化的逆向过程,即为反序列化(unpickling),就是把序列化的对象(或者变量)重新读到内存中~
Python中序列化的模块
模块名称
描述
提供的api
json
用于实现Python数据类型与通用(json)字符串之间的转换
dumps()、dump()、loads()、load()
pickle
用于实现Python数据类型与Python特定二进制格式之间的转换
dumps()、dump()、loads()、load()
shelve
专门用于将Python数据类型的数据持久化到磁盘,shelve是一个类似dict的对象,操作十分便捷
open()
json模块
大部分编程语言都会提供处理json数据的接口,Python 2.6开始加入了json模块,且把它作为一个内置模块提供,无需下载即可使用。
json支持的数据格式有限,有int str list dict以及特殊的tuple(会将tuple转为list)
Json模块提供了四个功能:dumps、dump、loads、load
dumps和loads主要是在内存内操作,如下:
import json list = ['a','b','c'] list_str = json.dumps(list) print(list_str) #["a", "b", "c"] list2 = json.loads(list_str) print(list2) #['a', 'b', 'c']
而dump和load是从文件内操作,如下:
import json list = ['a','b','c'] with open('test','w',encoding='utf-8') as f: json.dump(list,f) with open('test','r',encoding='utf-8') as f2: json.load(f2)
json模块中的字符编码问题
在Python3中,代码中的字符串都是使用 unicode 格式存放的,序列化之后也是以unicode 格式存放,所以序列化和反序列化过程都不存在问题。
Python2中,代码中的字符串是 str类型,str类型 和 unicode类型 的关系如下所示:
unicode -----> encode --------> str(例如为 utf-8编码)
utf-8(例如为 utf-8编码) --------> decode ----------> unicode
所以在Python2中,序列化过程和反序列化过程都有涉及到转码过程(encode和decode),序列化过程 会先将对象中的字符串 使用utf-8 进行解码(decode),转换为unicode类型后,再存放到文件或者字符串中,反序列化过程 会将 json字符串 使用utf-8 编码(encode),然后存放到内存中的变量~
pickle模块
用法与json类似,不过pickle不能跨语言,优点是它支持python所有的数据类型
需要注意的是,pickle是以bytes类型来进行序列化的
import pickle list = ['a','b','c'] list_str = pickle.dumps(list) print(list_str) #b'\x80\x03]q\x00(X\x01\x00\x00\x00aq\x01X\x01\x00\x00\x00bq\x02X\x01\x00\x00\x00cq\x03e.' list2 = pickle.loads(list_str) print(list2) #['a', 'b', 'c']
而正因为pickle是以bytes类型进行序列化的,所以在用dump和load方法对文件进行写入或者反序列化的时候,要以wb或者rb模式打开,如下:
import pickle list = ['a','b','c'] with open('test','wb') as f: pickle.dump(list,f) with open('test','rb') as f2: pickle.load(f2)
shelve模块
shelve也是python提供给我们的序列化工具,比pickle用起来更简单一些。 shelve只提供给我们一个open方法,是用key来访问的,使用起来和字典类似。
import shelve f = shelve.open('test1') f['key'] = {'a':1, 'b':2, 'c':'sss'} #直接对文件句柄操作,就可以存入数据 f['key2'] = {'d':3, 'e':4, 'f':'ddd'} f.close() f1 = shelve.open('test1') dic1 = f1['key'] #取出数据的时候也只需要直接用key获取即可,但是如果key不存在会报错 dic2 = f1['key2'] f1.close() print(dic1) print(dic2)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新日志
- 大提琴-刘欣欣《爱的问候》HDCD[WAV+CUE]
- 周耀辉/邓慧中《从什么时候开始》[320K/MP3][95.71MB]
- 周耀辉/邓慧中《从什么时候开始》[FLAC/分轨][361.29MB]
- 蒋荣宗《蒋荣宗ZONG x FOCA 夏日马戏节》[320K/MP3][89.28MB]
- 坣娜.1997-你怎么可以不爱我【巨石】【WAV+CUE】
- 群星.1992-暗恋桃花源电影原声带【滚石】【WAV+CUE】
- 林隆璇.1989-愤怒的情歌【巨石】【WAV+CUE】
- 勤琴《海上花》[DTS-WAV分轨]
- 群星《歌声有故事》[DTS-WAV分轨]
- [发烧人声]群星《邂逅》DTS-WAV
- 艻打绿《夏/狂热(苏打绿版)》[320K/MP3][106.42MB]
- 艻打绿《夏/狂热(苏打绿版)》[FLAC分轨][574.2MB]
- 黄雨勳《魔法列车首部曲》[320K/MP3][33.1MB]
- 李蕙敏.2014-记得·销魂新歌+精丫乐意唱片】【WAV+CUE】
- 谢金燕.1995-含泪跳恰蔷冠登】【WAV+CUE】