1.pickle介绍

pickle 是一个 python 中, 压缩/保存/提取 文件的模块. 最一般的使用方式非常简单.。Python有一个更原始的序列化模块marshal,但通常pickle应该始终是序列化Python对象的首选方法。 marshal主要用于支持Python的.pyc 文件。

tuples, lists, sets, and dictionaries都是能被保存的。

pickle模块与marshal几个重要方面不同:

(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.dumpobjfileprotocol = 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.loadfile*fix_imports = Trueencoding =“ASCII”errors =“strict” 

从打开的文件对象 文件中读取pickle对象表示,并返回其中指定的重构对象层次结构。这相当于Unpickler(file).load()

pickle的协议版本是自动检测的,因此不需要协议参数。超过pickle对象的表示的字节将被忽略。

参数文件必须有两个方法,一个采用整数参数的read()方法和一个不需要参数的readline()方法。两种方法都应返回字节。因此,文件可以是为二进制读取打开的磁盘文件,io.BytesIO对象或满足此接口的任何其他自定义对象。

可选的关键字参数是fix_importsencodingerrors,用于控制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()

图例:

python之pickle模块

相关文章: