📅  最后修改于: 2020-04-16 14:02:06             🧑  作者: Mango
pickle模块用于实现二进制协议,以对Python对象结构进行序列化和反序列化。
模块接口:
为了更好地控制序列化和反序列化,将分别创建Pickler或Unpickler对象。
pickle模块提供的常量:
pickle模块提供的函数:
# Python程序来说明pickle.dump()
import pickle
from StringIO import StringIO
class SimpleObject(object):
def __init__(self, name):
self.name = name
l = list(name)
l.reverse()
self.name_backwards = ''.join(l)
return
data = []
data.append(SimpleObject('pickle'))
data.append(SimpleObject('cPickle'))
data.append(SimpleObject('last'))
# 用StringIO模拟文件
out_s = StringIO()
# 写入流
for o in data:
print 'WRITING: %s (%s)' % (o.name, o.name_backwards)
pickle.dump(o, out_s)
out_s.flush()
输出:
WRITING: pickle (elkcip)
WRITING: cPickle (elkciPc)
WRITING: last (tsal)
2,pickle.dumps(obj,protocol = None,*,fix_imports = True)
此函数以字节对象形式返回对象的pickle表示形式。
范例:
# Python程序来说明Picle.dumps()
import pickle
data = [ { 'a':'A', 'b':2, 'c':3.0 } ]
data_string = pickle.dumps(data)
print 'PICKLE:', data_string
输出:
PICKLE: (lp0
(dp1
S'a'
p2
S'A'
p3
sS'c'
p4
F3.0
sS'b'
p5
I2
sa.
3,pickle.load(file,*,fix_imports = True,encoding=“ ASCII”,errors =“严格”)
此函数等效于Unpickler(file).load()。此函数用于从打开的目标文件中读取pickle的对象表示形式,并返回指定的重构对象层次结构。
范例:
# Python程序来说明pickle.load()
import pickle
from StringIO import StringIO
class SimpleObject(object):
def __init__(self, name):
self.name = name
l = list(name)
l.reverse()
self.name_backwards = ''.join(l)
return
data = []
data.append(SimpleObject('pickle'))
data.append(SimpleObject('cPickle'))
data.append(SimpleObject('last'))
# 用StringIO模拟文件
out_s = StringIO()
# 写入流
for o in data:
print 'WRITING: %s (%s)' % (o.name, o.name_backwards)
pickle.dump(o, out_s)
out_s.flush()
# 设置可读流
in_s = StringIO(out_s.getvalue())
# 读取数据
while True:
try:
o = pickle.load(in_s)
except EOFError:
break
else:
print 'READ: %s (%s)' % (o.name, o.name_backwards)
输出:
WRITING: pickle (elkcip)
WRITING: cPickle (elkciPc)
WRITING: last (tsal)
READ: pickle (elkcip)
READ: cPickle (elkciPc)
READ: last (tsal)
4,pickle.loads(bytes_object,*,fix_imports = True,encoding=“ ASCII”,errors =“严格”)
此函数用于从字节对象读取pickle的对象表示形式,并返回指定的重构对象层次结构。
范例:
# Python程序来说明pickle.loads()
import pickle
import pprint
data1 = [ { 'a':'A', 'b':2, 'c':3.0 } ]
print 'BEFORE:',
pprint.pprint(data1)
data1_string = pickle.dumps(data1)
data2 = pickle.loads(data1_string)
print 'AFTER:',
pprint.pprint(data2)
print 'SAME?:', (data1 is data2)
print 'EQUAL?:', (data1 == data2)
输出:
BEFORE:[{'a': 'A', 'b': 2, 'c': 3.0}]
AFTER:[{'a': 'A', 'b': 2, 'c': 3.0}]
SAME?: False
EQUAL?: True
pickle模块提供的异常:
pickle模块导出的类:
f = io.BytesIO()
p = pickle.Pickler(f)
p.dispatch_table = copyreg.dispatch_table.copy()
p.dispatch_table[SomeClass] = reduce_SomeClass
2, 类 pickle.Unpickler(file,*,fix_imports = True,encoding=“ ASCII”,errors=“ strict”)。
此类使用一个二进制文件来读取泡pickle据流。
什么可以pickle和不可pickle?
可以pickle以下类型:
pickle类实例:
本节说明可用于定义,自定义和控制如何pickle和unpickle类实例的通用机制。
无需其他代码即可使实例可pickle。默认情况下,pickle将通过自省检索实例的类和属性。
类可以通过提供一种或几种特殊方法来更改默认行为:
示例:处理有状态对象
此示例说明如何修改类的pickle行为。TextReader类打开一个文本文件,并在每次调用其readline()方法时返回行号和行内容。
class TextReader:
"""Print and number lines in a text file."""
def __init__(self, filename):
self.filename = filename
self.file = open(filename)
self.lineno = 0
def readline(self):
self.lineno + = 1
line = self.file.readline()
if not line:
return None
if line.endswith('\n'):
line = line[:-1]
return "%i: %s" % (self.lineno, line)
def __getstate__(self):
# 从self .__ dict__复制对象的状态,该对象包含我们所有的实例属性。
# 始终使用dict.copy()方法以避免修改原始状态。
state = self.__dict__.copy()
# 删除不可拾取的条目.
del state['file']
return state
def __setstate__(self, state):
# 恢复实例属性(即文件名和行号).
self.__dict__.update(state)
# 恢复先前打开的文件的状态。为此,我们需要重新打开它并从中读取直到恢复行数。
file = open(self.filename)
for _ in range(self.lineno):
file.readline()
# 最后,保存文件.
self.file = file
reader = TextReader("hello.txt")
print(reader.readline())
print(reader.readline())
new_reader = pickle.loads(pickle.dumps(reader))
print(new_reader.readline())
输出:
'1: Hello world!'
'2: I am line number two.'
'3: Goodbye!