python开发_pickle

pickle模块使用的数据格式是python专用的,并且不同版本不向后兼容,同时也不能被其他语言说识别。要和其他语言交互,可以使用内置的json包使用pickle模块你可以把Python对象直接保存到文件,而不需要把他们转化为字符串,也不用底层的文件访问操作把它们写入到一个二进制文件里。 pickle模块会创建一个python语言专用的二进制格式,你基本上不用考虑任何文件细节,它会帮你干净利落地完成读写独享操作,唯一需要的只是一个合法的文件句柄。 pickle模块中的两个主要函数是dump()和load()。dump()函数接受一个文件句柄和一个数据对象作为参数,把数据对象以特定的格式保存到给定的文件中。当我们使用load()函数从文件中取出已保存的对象时,pickle知道如何恢复这些对象到它们本来的格式。         dumps()函数执行和dump() 函数相同的序列化。取代接受流对象并将序列化后的数据保存到磁盘文件,这个函数简单的返回序列化的数据。         loads()函数执行和load() 函数一样的反序列化。取代接受一个流对象并去文件读取序列化后的数据,它接受包含序列化后的数据的str对象, 直接返回的对象。         cPickle是pickle得一个更快得C语言编译版本。 pickle和cPickle相当于java的序列化和反序列化操作

以上来源:http://www.2cto.com/kf/201009/74973.html

下面是python的API中的Example:

 1 # Simple example presenting how persistent ID can be used to pickle
 2 # external objects by reference.
 3 
 4 import pickle
 5 import sqlite3
 6 from collections import namedtuple
 7 
 8 # Simple class representing a record in our database.
 9 MemoRecord = namedtuple("MemoRecord", "key, task")
10 
11 class DBPickler(pickle.Pickler):
12 
13     def persistent_id(self, obj):
14         # Instead of pickling MemoRecord as a regular class instance, we emit a
15         # persistent ID.
16         if isinstance(obj, MemoRecord):
17             # Here, our persistent ID is simply a tuple, containing a tag and a
18             # key, which refers to a specific record in the database.
19             return ("MemoRecord", obj.key)
20         else:
21             # If obj does not have a persistent ID, return None. This means obj
22             # needs to be pickled as usual.
23             return None
24 
25 
26 class DBUnpickler(pickle.Unpickler):
27 
28     def __init__(self, file, connection):
29         super().__init__(file)
30         self.connection = connection
31 
32     def persistent_load(self, pid):
33         # This method is invoked whenever a persistent ID is encountered.
34         # Here, pid is the tuple returned by DBPickler.
35         cursor = self.connection.cursor()
36         type_tag, key_id = pid
37         if type_tag == "MemoRecord":
38             # Fetch the referenced record from the database and return it.
39             cursor.execute("SELECT * FROM memos WHERE key=?", (str(key_id),))
40             key, task = cursor.fetchone()
41             return MemoRecord(key, task)
42         else:
43             # Always raises an error if you cannot return the correct object.
44             # Otherwise, the unpickler will think None is the object referenced
45             # by the persistent ID.
46             raise pickle.UnpicklingError("unsupported persistent object")
47 
48 
49 def main():
50     import io
51     import pprint
52 
53     # Initialize and populate our database.
54     conn = sqlite3.connect(":memory:")
55     cursor = conn.cursor()
56     cursor.execute("CREATE TABLE memos(key INTEGER PRIMARY KEY, task TEXT)")
57     tasks = (
58         'give food to fish',
59         'prepare group meeting',
60         'fight with a zebra',
61         )
62     for task in tasks:
63         cursor.execute("INSERT INTO memos VALUES(NULL, ?)", (task,))
64 
65     # Fetch the records to be pickled.
66     cursor.execute("SELECT * FROM memos")
67     memos = [MemoRecord(key, task) for key, task in cursor]
68     # Save the records using our custom DBPickler.
69     file = io.BytesIO()
70     DBPickler(file).dump(memos)
71 
72     print("Pickled records:")
73     pprint.pprint(memos)
74 
75     # Update a record, just for good measure.
76     cursor.execute("UPDATE memos SET task='learn italian' WHERE key=1")
77 
78     # Load the records from the pickle data stream.
79     file.seek(0)
80     memos = DBUnpickler(file, conn).load()
81 
82     print("Unpickled records:")
83     pprint.pprint(memos)
84 
85 
86 if __name__ == '__main__':
87     main()

运行效果:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏偏前端工程师的驿站

MyBatis魔法堂:即学即用篇

一、前言                                          本篇内容以理解MyBatis的基本用法和快速在项目中实践为目的,...

23460
来自专栏Golang语言社区

go语言的sql包原理与用法分析

go的sql包是在pkg/database中,里面的两个包sql和sql/driver可以一起看。建议看这个两个包之前可以先看看sql文件夹下的doc.txt。...

30740
来自专栏Golang语言社区

go语言的sql包原理与用法分析

本文实例讲述了go语言的sql包原理与用法。分享给大家供大家参考,具体如下: go的sql包是在pkg/database中,里面的两个包sql和sql/driv...

46660
来自专栏java学习

Java每日一练(2017/8/2)

本期题目: (单选题)1、在 java 中,一个类可同时定义为许多同名的方法,这些方法的形式参数个数,类型或顺序各不相同,传回的值可能个不相同,这种面向对象的...

30670
来自专栏PHP在线

mysql学习笔记

InnoDB引擎与MyISAM引擎 mysql是关系型数据库。其中的存储引擎可以show engines来查看。我的版本是5.6.26的,查看版本用selec...

29250
来自专栏机器学习从入门到成神

Java知识点总结

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_35512245/articl...

21610
来自专栏用户2442861的专栏

初学Redis(2)——用Redis作为Mysql数据库的缓存

http://blog.csdn.net/qtyl1988/article/details/39519951

20620
来自专栏*坤的Blog

自写文件小工具类

18930
来自专栏chenssy

【死磕Sharding-jdbc】---结果合并

接下来以执行 SELECT o.*FROM t_order o whereo.user_id=10order byo.order_id desc limit 2...

12930
来自专栏耕耘实录

Linux三大剑客之awk

版权声明:本文为耕耘实录原创文章,各大自媒体平台同步更新。欢迎转载,转载请注明出处,谢谢

19640

扫码关注云+社区

领取腾讯云代金券