1.pickle介绍
pickle 是一个 python 中, 压缩/保存/提取 文件的模块. 最一般的使用方式非常简单.。Python有一个更原始的序列化模块marshal,但通常pickle应该始终是序列化Python对象的首选方法。 marshal主要用于支持Python的.pyc 文件。
tuples, lists, sets, and dictionaries都是能被保存的。
(1)pickle模块跟踪它已经序列化的对象,以便稍后对同一对象的引用不会再次序列化。 marshal不这样做。
(2) pickle可以透明地保存和恢复类实例,但是类定义必须是可导入的,并且与存储对象时存在于同一模块中。marshal不能用于序列化用户定义的类及其实例。
(3)pickle序列化格式是保证不同的Python版本向后兼容。marshal序列化格式是不能保证整个Python版本移植。因为它的主要工作是支持 .pyc文件,所以Python实施者保留在需要时以非向后兼容的方式更改序列化格式的权利。
pickle与json不同:
(1)JSON是一种文本序列化格式(它输出unicode文本,虽然大部分时间它被编码utf-8),而pickle是二进制序列化格式;
(2)JSON是人类可读的,而pickle不是;
(3)JSON是可互操作的,并且在Python生态系统之外广泛使用,而pickle是特定于Python的;
(4)默认情况下,JSON只能表示Python内置类型的子集,而不能表示自定义类; pickle可以代表极其庞大的Python类型(其中许多是自动的,通过巧妙地使用Python的内省工具;复杂的案例可以通过实现特定的对象API来解决)。
2.pickle的dump和load
要序列化对象层次结构,只需调用该dumps()函数即可。同样,要对数据流进行反序列化,请调用该loads()函数。
pickle.dump(obj,file,protocol = None,*,fix_imports = True )
将obj的pickled表示写入打开的文件对象 文件。这相当于。Pickler(file, protocol).dump(obj)
可选的协议参数,一个整数,告诉pickler使用给定的协议; 支持的协议是0到HIGHEST_PROTOCOL。如果未指定,则默认为DEFAULT_PROTOCOL。如果指定了负数,HIGHEST_PROTOCOL则选择。
的文件参数必须具有接受单个字节的参数写()方法。因此,它可以是为二进制写入打开的磁盘文件,io.BytesIO实例或满足此接口的任何其他自定义对象。
如果fix_imports为true且protocol小于3,则pickle将尝试将新的Python 3名称映射到Python 2中使用的旧模块名称,以便使用Python 2可读取pickle数据流。
pickle.load(file,*,fix_imports = True,encoding =“ASCII”,errors =“strict” )
从打开的文件对象 文件中读取pickle对象表示,并返回其中指定的重构对象层次结构。这相当于Unpickler(file).load()。
pickle的协议版本是自动检测的,因此不需要协议参数。超过pickle对象的表示的字节将被忽略。
参数文件必须有两个方法,一个采用整数参数的read()方法和一个不需要参数的readline()方法。两种方法都应返回字节。因此,文件可以是为二进制读取打开的磁盘文件,io.BytesIO对象或满足此接口的任何其他自定义对象。
可选的关键字参数是fix_imports,encoding和errors,用于控制Python 2生成的pickle流的兼容性支持。如果fix_imports为true,则pickle将尝试将旧的Python 2名称映射到Python 3中使用的新名称。编码和 错误告诉pickle如何解码Python 2腌制的8位字符串实例; 这些默认分别为'ASCII'和'strict'。该编码可以是“字节”作为字节对象读取这些8位串的实例。
3.代码实例
import pickle
# 序列化数据,写入mysql.txt文件
def write_data():
with open('./mysql.txt', 'w') as f:
shuru_mysql = ['127.0.0.1', 'hc_ff', 'cs_sf', '3306', 'ka','select m.node_id, m.node_name, m.IP, m.res_id, m.res_name, m.dd_name, m.mitem_id, m.mitem_name, m.tablename from v_hcmedata as m']
pickle.dump(shuru_mysql, f)
f.close()
import pickle
# 读取mysql.txt文件的数据
def read_data():
# 判断mysql.txt文档是否存在,存在就读取参数
if os.access("./mysql.txt", os.F_OK):
with open('./mysql.txt', 'r') as f:
data_mysql = pickle.load(f)
host_mysql = str(data_mysql[0])
user_mysql = str(data_mysql[1])
password_mysql = str(data_mysql[2])
port_mysql = int(data_mysql[3])
database_mysql = str(data_mysql[4])
sql_mysql = str(data_mysql[5])
f.close()
图例: