Python文件读写之pickle模块的应用

使用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等。那么,序列化和反序列化到低有什么用呢?

  1. 便于存储。序列化过程将文本信息转变为二进制数据流。这样就信息就容易存储在硬盘之中,当需要读取文件的时候,从硬盘中读取数据,然后再将其反序列化便可以得到原始的数据。在Python程序运行中得到了一些字符串、列表、字典等数据,想要长久的保存下来,方便以后使用,而不是简单的放入内存中关机断电就丢失数据。python模块大全中的pickle模块就派上用场了,它可以将对象转换为一种可以存储的格式。

  2. 便于传输。当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把這个对象转换为字节序列(序列化)才能在网络上传输;接收方则需要把字节序列在恢复为对象(反序列化)。

原文地址:https://www.cnblogs.com/slz99/p/12527750.html