python中的pickle库

发布时间 2023-03-22 21:16:56作者: 一先生94

1.1 持久化模块

pickle模块是Python专用的持久化模块,所谓的持久化就是让数据持久化保存,可以持久化包括自定义类在内的各种数据,比较适合Python本身复杂数据的存储。但是持久化后的字符串是只能用于Python环境,不能用作与其他语言进行数据交换。pickle的本意是腌渍的意思,就是将物品永久地保存成文件,用的时候读出来还能用。

1.2 pickle模块的作用

pickle模块的作用是把Python对象直接保存到文件里,而不需要先把它们转化为字符串再保存,也不需要用底层的文件访问操作,直接把它们写入一个二进制文件里。pickle模块会创建一个Python语言专用的二进制格式,不需要使用者考虑任何文件细节,它会帮你完成读写对象的操作。用pickle比打开文件、转换数据格式以及写入文件的操作能够节省不少代码。
pickle本身和json的功能是相同的,都是将Python数据对象保存为持久化的文件,区别是pickle能够保存Python的复杂的数据类型,包括列表、元组、自定义类等,而json只能保存字典类型的数据,同时pickle是能用Python打开,而json却可以被其他语言所读取。

1.3 使用方法

在pickle中dumps()和loads()操作的类型是bytes类型,而在使用dumpy()和load()读写文件时,要使用rb或wb模式(二进制),也就是只接收bytes类型的数据。pickle的转化形式与json相同:

1.4、pickle模块常用函数

(1)pickle.dump(obj, file, [,protocol])

函数的功能:将obj对象序列化存入已经打开的file中。

参数:

obj:想要序列化的obj对象。

file:文件名称。

protocol:序列化使用的协议。如果该项省略,则默认为0。如果为负值或HIGHEST_PROTOCOL,则使用最高的协议版本。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import pickle
 
 
# 将test对象序列化到文件中
def dump_test_data():
    test = [1, 2, 3]
    with open("test.pickle", "wb") as file:
        pickle.dump(test, file)

(2)pickle.load(file)

函数的功能:将file中的对象序列化读出。

参数:

file:文件名称。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import pickle
 
 
# 将文件中test对象序列化读出
def load_test_data():
    with open("test.pickle", "rb") as file:
        test = pickle.load(file)
    return test

(3)pickle.dumps(obj[, protocol])

函数的功能:将obj对象序列化为string形式,而不是存入文件中。

参数:

obj:想要序列化的obj对象。

protocal:如果该项省略,则默认为0。如果为负值或HIGHEST_PROTOCOL,则使用最高的协议版本。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import pickle
 
 
# 将test对象序列化为字符串形式
def dumps_test_data():
    test = [1, 2, 3]
    # dumps 将数据通过特殊的形式转换为仅python语言识别的字符串
    str_test = pickle.dumps(test)
    print(str_test)

(4)pickle.loads(string)

函数的功能:从string中读出序列化前的obj对象。

参数:

string:文件名称。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import pickle
 
 
# 从string中读出序列化前的对象
def loads_test_data():
    test = [1, 2, 3]
    str_test = pickle.dumps(test)
    # loads 将pickle数据转化为python的数据结构
    loads_test = pickle.loads(str_test)
    print(loads_test)

  

转载自:https://blog.csdn.net/kevinjin2011/article/details/125525373