Python中的Pickle库函数及其用途
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 库时,应避免将未知来源的数据进行反序列化,以避免潜在的安全问题。
