欢迎访问宙启技术站
智能推送

Python中的Pickle库函数及其用途

发布时间:2023-06-21 12:29:06

Pickle 是 Python 当中用于序列化对象的一个库。它可以将对象转化为字节流,这样就可以将其保存到文件或者将其传输给别的机器。在实际应用中,Pickle 通常用于缓存、对象存储或者网络数据传输等领域。

Python 中的 Pickle 库内置了一些函数,包括 dump、dumps、load、loads,分别对应着将对象序列化为字节流、将字节流保存到文件、从文件中读取字节流并反序列化为对象、从字节流中反序列化为对象。下面逐一介绍这些函数及其主要用途。

## dump

dump 函数将一个对象序列化并将其存储到一个文件中。它的函数签名如下:

pickle.dump(obj, file, protocol=None, *, fix_imports=True)

其中,obj 参数为需要序列化的对象,file 参数是一个可写的文件对象,protocol 参数指定了使用的协议版本。protocol 为 None 时,使用默认协议版本。

使用 dump 函数,可以将对象序列化为一个字节流,并保存到文件中。在需要的时候,只需要使用 load 函数将其从文件中反序列化即可。

下面是一个示例代码:

import pickle

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

person = Person('Tom', 20)

with open('person.pkl', 'wb') as f:
    pickle.dump(person, f)

with open('person.pkl', 'rb') as f:
    person_read = pickle.load(f)

print(person_read.name) # Tom
print(person_read.age) # 20

## dumps

dumps 函数将一个对象序列化并返回一个字节流。它的函数签名如下:

pickle.dumps(obj, protocol=None, *, fix_imports=True)

其中,obj 参数为需要序列化的对象,protocol 参数指定了使用的协议版本。protocol 为 None 时,使用默认协议版本。

使用 dumps 函数,可以将对象序列化为一个字节流,方便在网络或其他应用场景中进行传输。

下面是一个示例代码:

import pickle

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

person = Person('Tom', 20)

person_pickled = pickle.dumps(person)
person_read = pickle.loads(person_pickled)

print(person_read.name) # Tom
print(person_read.age) # 20

## load

load 函数从一个文件中读取字节流并反序列化为对象。它的函数签名如下:

pickle.load(file, *, fix_imports=True, encoding="ASCII", errors="strict")

其中,file 参数是一个可读的文件对象,其余参数用于读取文件时的编码和错误处理方式。

使用 load 函数,我们可以从文件中读取之前保存的序列化对象,并将其反序列化为 Python 对象,方便后续的处理。

下面是一个示例代码:

import pickle

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

with open('person.pkl', 'rb') as f:
    person_read = pickle.load(f)

print(person_read.name) # Tom
print(person_read.age) # 20

## loads

loads 函数从一个字节流中反序列化为对象。它的函数签名如下:

pickle.loads(bytes_object, *, fix_imports=True, encoding="ASCII", errors="strict")

其中,bytes_object 参数是一个字节流,其余参数用于指定编码和错误处理方式。

使用 loads 函数,我们可以将之前序列化的对象字节流反序列化为 Python 对象,方便后续的处理。

下面是一个示例代码:

import pickle

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

person_pickled = b'\x80\x04\x95\x18\x00\x00\x00\x00\x00\x00\x00\x8c\x08__main__\x94\x8c\x06Person\x94\x93\x94)\x81\x94}\x94(\x8c\x04name\x94\x8c\x03Tom\x94\x8c\x03age\x94K\x14\x86\x94.'
person_read = pickle.loads(person_pickled)

print(person_read.name) # Tom
print(person_read.age) # 20

总结:Pickle 库提供了序列化和反序列化 Python 对象的功能,方便在网络、存储和缓存等应用场景中使用。需要注意的是,在使用 Pickle 库时,应避免将未知来源的数据进行反序列化,以避免潜在的安全问题。