用pip安装numpy,使用pip命令安装numpy、scipy模块
目录
0.摘要
1.简单的例子
2.模块接口
2.1pickle.dump(obj,file,protocol=None,*,fix_imports=True).
2.2pickle.load(file,*,fix_imports=True,encoding="ASCII ,errors="strict ))
2.3pickle.dumps(obj,protocol=None,*,fix_imports=True).
2.4pickle.loads(bytes_object,*,fix_imports=True,encoding="ASCII ,errors="strict ))
3 . prosandconsfusingpicklemodule
0.概述picklemodulesuused for implementation gbinary protocols for serializingande-serializingapthonobjectstructure。
Python pickle模块是二进制协议的实现,用于Python中对象结构的“正向”序列化和“反向”反序列化。“序列化”转换结构化的Python对象(list、dict等。)转换成字节流。一般来说,采摘,展平或编组。反序列化过程也称为挑选。
为什么需要序列化?总之,便于向其他系统传输数据等。或者将其保存为文件或数据库。
本文介绍了pickle模块的入门级用法。
1.举个简单的例子,要使用pickle函数,您必须首先部署pickle模块。
以下示例将list mylist的内容序列化,然后存储在datafile.txt文件中:pickle.dump()函数直接完成序列化和文件写入操作。因为它已经被转换成字节序列,所以只能以二进制格式保存到文件中。所以open))命令的选项是‘WB’,b表示二进制。
Import picklemylist=[a , b , c , d]withopen(datafile.txt , wb) asfh: pickle.dump] my list。令人惊讶的是,因为是二进制格式,所以无法识别。
所以,你经常用后缀(比如。pkl或者。pickle)而不是txt后缀,这样一看就知道是pickle格式。
接下来,让我们看看是否可以从datafile.txt中恢复刚才的数据
pickle _ dat=open(datafile . txt,)Rb))unpacked=pickle . load)picked _ dat)print)unpacked)输出如下
[a ,b ,c ,d]
看另一个序列化和反序列化python dict的例子。
staffDict={1:李,2:姚,3:张,4:王,5:刘 } pickle=Open( staff dict . pkl , wb)pickle.dump(staffDict,pickle)pickle . close()pickle=Open( staff dict . pkl , Rb )RecoveredStaffDict=pickle . load(Pickled)Print(RecoveredStaffDict)Output:{ 1:李,2:姚,3:张
上面的例子使用了pickle.load()和pickle.dump()最基本的用法,也是pickle模块最基本最有用的方法。
2.模块接口pickle模块包括以下函数和常数的定义:
(1) dump():序列化对象层次结构并写入数据文件
(2)load():dump()的反向处理。从数据文件中读取经过酸洗的数据流并反序列化。
(3)dumps()-调用此函数将对象层次结构序列化为数据流,而不是将其写入数据文件。
(4)loads()调用此函数来反序列化数据流。
(5)泡菜。HIGHEST_PROTOCOL:整数值,指定支持的最高协议版本号。它由dump()和dump()使用。
(6)泡菜。DEFAULT_PROTOCOL:未指定协议参数时默认使用的协议代码。
2.1 pickle.dump(obj,file,protocol=None,*,fix_imports=True)
这个功能相当于picker(文件,协议)。Dump (obj),用于序列化python对象结果,并将其写入指定文件。
可选参数protocol用于指定协议代码,支持的协议代码从0到HIGHEST_PROTOCOL(pickle常量)。如果未指定,则使用DEFAULT_PROTOCOL,如果指定的值为负值,则使用HIGHEST_PROTOCOL。
如果参数fix_imports为真,协议小于等于3,pickle模块会将新python3的名称映射到旧python2的模块名称,这样python2就可以读取序列化的数据。python2的消失是注定的,虽然还需要一段时间,所以对于初学者用户来说,不会再遇到python2,所以不需要太在意这些东西。
下面是pickle.dump()更复杂的实际例子。
#泡菜。dump()import pickle import ioclass简单对象(object):def _ _ init _ _(self,name):self。name=name l=list(name)l . reverse()self。name _ backwards=“”.join(l)返回数据=[]数据。追加(简单对象( pickle ))数据。追加(简单对象( cPickle ))数据。append(简单对象( last )#写入流pickle=open( dump。数据中o的pkl , WB ):print( WRITING:% s(% s) %(o . name,o . name _ backwarded))pickle。dump(data,pickle)写:pickle(elk CIP)写:cPickle(elk IPC)写:last(tsal)2.2。2份泡菜
该函数等价于拆线器(文件)。load(),用于从文件中读取序列化后的数据并进行反序列化恢复出原大蟒对象层次结构。
示例:
# Python程序来说明# pick . load()#设置一个可读的streamin_s=io .StringIO(out _ s . getvalue())pickle _ dat=open( dump。pkl , Rb )unpickled=pickle。load(pickle _ dat)# print(unpickled)for o in unpickled:print( READ:% s(% s) %(o . name,o . name _ backwarded))READ:pickle(elk CIP)READ:c pickle(elk CIP)READ:last(tsal)2.3 pickle。转储(obj,protocol=None,*,fix_imports=True)
这个函数与转储()的区别在于它将序列化后的数据存储在一个字节流对象(字节流对象)中。这里的" s "指的是溪流。
所以它不需要指定文件名。它返回的就是所生成的字节流对象的把手。
示例:
#泡菜。dumps()import PICKLE data=[{ A : A , b:2, c :3.0 }]data _ string=PICKLE。dumps(data)print( PICKLE:,data _ string)PICKLE:b \ X80 \ x04 \ x95 # \ x00 \ x00 \ x00 \ x00 \ x94(\ x8c \ x01A \ x94 \ x8c \ x01b \ x 942.4 PICKLE . loads(bytes _ object,*,fix_imports=True,encoding="ASCII ",errors="strict ")
它与转储()构成一对。直接从泡菜序列化后的字节流对象恢复出原始的结构层次。
注意,它多了两个参数,一个是编码,一个是错误。
示例:
#泡菜。loads()import pickle import pprintdata 1=[{ A : A , b:2, c:3.0 } ]print (BEFORE:)pprint。pprint(data1)data1 _ string=pickle。转储(数据1)数据2=pickle。loads(data1 _ string)print( AFTER:)pprint。pprint(数据2)打印(相同?,(数据一是数据2))打印(等于?,(数据1==数据2))前:[{a: A , b: 2, c :3.0 }]后:[{a: A , b: 2, c :3.0 }]相同?FalseEQUAL?正确
3.使用泡菜模块的利与弊
泡菜模块还提供一些例外以及一些导出的类,属于比较进阶的要素,本文暂时就不介绍了。
优点:
用于存储复杂的数据结构非常方便,使用简单,代码简单。
序列化的数据是二进制数据,不可读,所以也相当于提供一些最初阶的安全措施。
缺点:
蟒蛇泡菜序列化后的数据没有跨语言通用性,其它编程语言无法识别泡菜序列化后的数据。
泡菜本身没有安全防护能力,不会进行识别是否恶意数据以及给出警告。专注的荷花拿到一个泡菜数据时,如果不是很确定其来源和安全性,不建议随便进行序列化处理。否则的话可能会招致安全威胁。
[参考文献1]蟒蛇皮酸洗
[Ref2]pickle — Python对象序列化— Python 3.10.1文档
[Ref3]pickle — Python对象序列化极客论坛
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。