使用pickle库对list、tuple、dict、set数据类型进行文件读写:
文件数据类型除了字符串可以用文本读写的方式操作外,还有其他的数据类型。例如:list、tuple、dict、set等。在处理这些数据时我们不能按字符串的文本处理方式,而是按照二进制的读取方式。
另外,write()方法此时已不适用,这里需要用到标准模块pickle模块(数据持久性模块,可打包序列数据类型)dump()和load()方法进行读写操作。
代码如下:
#Authors:xiaobei
import pickle
Listdata = [1010,"xiaobei",(1,2)]
Tupledata = tuple(Listdata)
Dictdata = {"1":"A","2":"B"}
Setdata = set(Listdata)
list1 = [Listdata,Tupledata,Dictdata,Setdata]
path = r"C:UsersAdministratorDesktoplist.txt"
#这里一定是以二进制方式进行读写:wb,rb
with open(path,"wb") as fi:
pickle.dump(list1,fi) #序列化(转储)
with open(path,"rb") as fo:
List = pickle.load(fo) #反序列化(加载)
for data in List:
print(data,end = " {}
".format(type(data)))
输出结果:
[1010, 'xiaobei', (1, 2)] <class 'list'>
(1010, 'xiaobei', (1, 2)) <class 'tuple'>
{'1': 'A', '2': 'B'} <class 'dict'>
{(1, 2), 1010, 'xiaobei'} <class 'set'>
文件中数据的状态:
€]q (]q(M?X xiaobeiqKK唓eM?hh噏}q(X 1qX AqX 2qX Bq ucbuiltins
set
q
]q(hM?he卶Rq
e.
这是一堆乱码,当然这是以二进制方式存储在文本文件中的,文本方式打开看到一堆乱码也很正常,但是python可以理解它。
下面我们介绍pickle模块:
pickle模块有两种功能:序列化和反序列化,除了上述dump()和load()外,还有dumps()和loads()。
其中,dumps()与dump()区别是,dumps()不将对象写入文件,而是直接返回一个序列化的bytes对象。loads()与load()的区别是loads()不从文件中读取,而直接从序列化的bytes对象中读取信息。
pickle一词在英文中有 “泡菜” 之意,这里可以理解为 “腌制” 序列化数据。
然而,序列化和反序列化的模块不只pickle一个,还有json等。那么,序列化和反序列化到低有什么用呢?
便于存储。序列化过程将文本信息转变为二进制数据流。这样就信息就容易存储在硬盘之中,当需要读取文件的时候,从硬盘中读取数据,然后再将其反序列化便可以得到原始的数据。在Python程序运行中得到了一些字符串、列表、字典等数据,想要长久的保存下来,方便以后使用,而不是简单的放入内存中关机断电就丢失数据。python模块大全中的pickle模块就派上用场了,它可以将对象转换为一种可以存储的格式。
便于传输。当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把這个对象转换为字节序列(序列化)才能在网络上传输;接收方则需要把字节序列在恢复为对象(反序列化)。