python 对象序列化_12.1. pickle —— Python 对象序列化 — Python 3.6.12 文档

# Simple example presenting how persistent ID can be used to pickle

# external objects by reference.

import pickle

import sqlite3

from collections import namedtuple

# Simple class representing a record in our database.

MemoRecord = namedtuple("MemoRecord", "key, task")

class DBPickler(pickle.Pickler):

def persistent_id(self, obj):

# Instead of pickling MemoRecord as a regular class instance, we emit a

# persistent ID.

if isinstance(obj, MemoRecord):

# Here, our persistent ID is simply a tuple, containing a tag and a

# key, which refers to a specific record in the database.

return ("MemoRecord", obj.key)

else:

# If obj does not have a persistent ID, return None. This means obj

# needs to be pickled as usual.

return None

class DBUnpickler(pickle.Unpickler):

def __init__(self, file, connection):

super().__init__(file)

self.connection = connection

def persistent_load(self, pid):

# This method is invoked whenever a persistent ID is encountered.

# Here, pid is the tuple returned by DBPickler.

cursor = self.connection.cursor()

type_tag, key_id = pid

if type_tag == "MemoRecord":

# Fetch the referenced record from the database and return it.

cursor.execute("SELECT * FROM memos WHERE key=?", (str(key_id),))

key, task = cursor.fetchone()

return MemoRecord(key, task)

else:

# Always raises an error if you cannot return the correct object.

# Otherwise, the unpickler will think None is the object referenced

# by the persistent ID.

raise pickle.UnpicklingError("unsupported persistent object")

def main():

import io

import pprint

# Initialize and populate our database.

conn = sqlite3.connect(":memory:")

cursor = conn.cursor()

cursor.execute("CREATE TABLE memos(key INTEGER PRIMARY KEY, task TEXT)")

tasks = (

'give food to fish',

'prepare group meeting',

'fight with a zebra',

)

for task in tasks:

cursor.execute("INSERT INTO memos VALUES(NULL, ?)", (task,))

# Fetch the records to be pickled.

cursor.execute("SELECT * FROM memos")

memos = [MemoRecord(key, task) for key, task in cursor]

# Save the records using our custom DBPickler.

file = io.BytesIO()

DBPickler(file).dump(memos)

print("Pickled records:")

pprint.pprint(memos)

# Update a record, just for good measure.

cursor.execute("UPDATE memos SET task='learn italian' WHERE key=1")

# Load the records from the pickle data stream.

file.seek(0)

memos = DBUnpickler(file, conn).load()

print("Unpickled records:")

pprint.pprint(memos)

if __name__ == '__main__':

main()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值