📜  通过示例了解Python的pickle

📅  最后修改于: 2020-04-16 14:10:31             🧑  作者: Mango

先决条件:pickle — Python对象序列化
Python pickle模块用于对Python对象结构进行序列化和反序列化。可以pickle Python中的任何对象,以便将其保存在磁盘上。pickle所做的是先将对象“序列化”,然后再将其写入文件。pickle是一种将Python对象(列表,字典等)转换为字符流的方法。关键思想是,此字符流包含在另一个Python脚本中重构对象所需的所有信息。

# 使用pickle模块有效地说明Python3程序
# 模块将内存中的Python对象转换为序列化的字节流,可以写入任何类似文件对象的字节。
import pickle
def storeData():
    # 初始化要存储在数据库中的数据
    Omkar = {'key' : 'Omkar', 'name' : 'Omkar Pathak',
    'age' : 21, 'pay' : 40000}
    Jagdish = {'key' : 'Jagdish', 'name' : 'Jagdish Pathak',
    'age' : 50, 'pay' : 50000}
    # 数据库
    db = {}
    db['Omkar'] = Omkar
    db['Jagdish'] = Jagdish
    # 使用二进制模式很重要
    dbfile = open('examplePickle', 'ab')
    # 来源,目的地
    pickle.dump(db, dbfile)
    dbfile.close()
def loadData():
    # 对于读取二进制模式也很重要
    dbfile = open('examplePickle', 'rb')
    db = pickle.load(dbfile)
    for keys in db:
        print(keys, '=>', db[keys])
    dbfile.close()
if __name__ == '__main__':
    storeData()
    loadData()

输出:

omkarpathak-Inspiron-3542:〜/ Documents / Python-Programs $ Python P60_PickleModule.py
Omkar => {'age':21,'name':'Omkar Pathak','key':'Omkar','pay':40000}
Jagdish => {'age':50,'name':'Jagdish Pathak','key':'Jagdish','pay':50000}

没有文件的pickle操作

# 初始化要存储在数据库中的数据
Omkar = {'key' : 'Omkar', 'name' : 'Omkar Pathak',
'age' : 21, 'pay' : 40000}
Jagdish = {'key' : 'Jagdish', 'name' : 'Jagdish Pathak',
'age' : 50, 'pay' : 50000}
# 数据库
db = {}
db['Omkar'] = Omkar
db['Jagdish'] = Jagdish
# 用于存储
b = pickle.dumps(db)       # type(b)给出
# 用于加载
myEntry = pickle.loads(b)
print(myEntry)

使用pickle模块的优势:

  1. 递归对象(包含对其自身引用的对象): Pickle跟踪已序列化的对象,因此以后对同一对象的引用将不再被序列化。(元帅模块为此中断。)
  2. 对象共享(在不同位置引用同一对象):这类似于自引用对象;pickle将对象存储一次,并确保所有其他引用都指向主副本。共享对象保持共享状态,这对于可变对象非常重要。
  3. 用户定义的类及其实例: Marshal根本不支持这些类,但是pickle可以保存和还原类实例。类定义必须是可导入的,并且与对象存储时位于同一模块中