欢迎来到“只读课堂”!
In [1]:
#这节课我们讲pickle模块。"pickle"在中文里是泡菜的意思,但是在Python中并不是。下面我们来学习吧!
持久化存储
持久性:就是把数据保存起来可以多次重复使用,内存中的数据会因为我们关机或者其他原因导致数据丢失
什么是持久性?
持久性的基本思想很简单。假定有一个Python程序,它可能是一个管理日常待办事项的程序,您希望在多次执行这个程序之间可以保存应用程序对象(待办事项)。换句话说,您希望将对象存储在磁盘上,便于以后检索。这就是持久性。要达到这个目的,有几种方法,每一种方法都有其优缺点。
例如,可以将对象数据存储在某种格式的文本文件中,譬如 CSV 文件。或者可以用关系数据库,譬如 Gadfly (Gadfly 是一个简单的关系数据库系统,使用Python基于SQL结构化查询语言实现)、MySQL 、PostgreSQL。这些文件格式和数据库都非常优秀,对于所有这些存储机制,Python都有健壮的接口。
pickle模块则提供了一个简单的持久化功能。可以将数据对象原封不动的以文件的形式存放在磁盘上。
In [2]:
#列表:
In [3]:
mylist = [1,2,3,4,5]
In [4]:
#我们可以保存进去。但是某一天我们再要把它拿出来,还知道它是什么了吗?
In [5]:
#现在我们不光要保存数据,还要保存它们的状态。
Pickle模块函数(一)
数据对象二进制保存在内存:
pick_obj = pickle.dumps(obj): 返回了一个字符串,它包含了一个pickle格式的对象
mystr = loads(pick_obj): 返回包含在pickle字符串中的对象
In [6]:
import pickle
In [7]:
#我们来看一下可以用的命令
In [8]:
dir(pickle)
Out[8]:
['ADDITEMS',
'APPEND',
'APPENDS',
'BINBYTES',
'BINBYTES8',
'BINFLOAT',
'BINGET',
'BININT',
'BININT1',
'BININT2',
'BINPERSID',
'BINPUT',
'BINSTRING',
'BINUNICODE',
'BINUNICODE8',
'BUILD',
'DEFAULT_PROTOCOL',
'DICT',
'DUP',
'EMPTY_DICT',
'EMPTY_LIST',
'EMPTY_SET',
'EMPTY_TUPLE',
'EXT1',
'EXT2',
'EXT4',
'FALSE',
'FLOAT',
'FRAME',
'FROZENSET',
'FunctionType',
'GET',
'GLOBAL',
'HIGHEST_PROTOCOL',
'INST',
'INT',
'LIST',
'LONG',
'LONG1',
'LONG4',
'LONG_BINGET',
'LONG_BINPUT',
'MARK',
'MEMOIZE',
'NEWFALSE',
'NEWOBJ',
'NEWOBJ_EX',
'NEWTRUE',
'NONE',
'OBJ',
'PERSID',
'POP',
'POP_MARK',
'PROTO',
'PUT',
'PickleError',
'Pickler',
'PicklingError',
'PyStringMap',
'REDUCE',
'SETITEM',
'SETITEMS',
'SHORT_BINBYTES',
'SHORT_BINSTRING',
'SHORT_BINUNICODE',
'STACK_GLOBAL',
'STOP',
'STRING',
'TRUE',
'TUPLE',
'TUPLE1',
'TUPLE2',
'TUPLE3',
'UNICODE',
'Unpickler',
'UnpicklingError',
'_Framer',
'_Pickler',
'_Stop',
'_Unframer',
'_Unpickler',
'__all__',
'__builtins__',
'__cached__',
'__doc__',
'__file__',
'__loader__',
'__name__',
'__package__',
'__spec__',
'_compat_pickle',
'_dump',
'_dumps',
'_extension_cache',
'_extension_registry',
'_getattribute',
'_inverted_registry',
'_load',
'_loads',
'_test',
'_tuplesize2code',
'bytes_types',
'codecs',
'compatible_formats',
'decode_long',
'dispatch_table',
'dump',
'dumps',
'encode_long',
'format_version',
'io',
'islice',
'load',
'loads',
'maxsize',
'pack',
'partial',
're',
'sys',
'unpack',
'whichmodule']
In [9]:
obj = pickle.dumps(mylist)
In [10]:
#我们看一下obj是什么东西
In [11]:
obj
Out[11]:
b'\x80\x03]q\x00(K\x01K\x02K\x03K\x04K\x05e.'
In [12]:
#我们现在看到的是以b开头的16进制的字符串,这是为了我们方便去观看,二进制的话可能要显示好几行。
In [13]:
#如果我们要把返回出来的16进制的字符转换回列表:
In [14]:
var = pickle.loads(obj)
In [15]:
var
Out[15]:
[1, 2, 3, 4, 5]
In [16]:
#不光是可以把它在内存中这样处理,还可以直接把它保存在文件中。
Pickle模块函数(二)
数据对象二进制保存到文件:
dump(object,file):将对象写到文件,这个文件可以是实际的物理文件,但也可以是任何类似于文件的对象
obj = load(file):把文件对象里的我们之前保存进来的二进制数据返回成原先的数据对象
In [20]:
myfile = open('C:/Users/Jimmy/Desktop/1.txt','wb+')
In [21]:
#这样我们新建了一个文件
In [22]:
#现在我们要来把mylist写进保存在桌面的1.txt :
In [23]:
pickle.dump(myfile,mylist)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-23-6f76004e6a08> in <module>()
----> 1 pickle.dump(myfile,mylist)
TypeError: file must have a 'write' attribute
In [24]:
#它说你必须要有我们的这个写权限
In [25]:
#这里千万不能弄错,mylist和myfile位置绝对不能弄反。
In [26]:
pickle.dump(mylist,myfile)
In [27]:
#记住一定要关闭这个文件后才能显示:
In [28]:
myfile.close()
In [29]:
#是不是就有了?:
In [30]:
#好了,这个就是我们用pickle写入的文件。
In [31]:
#如果我们还要看到mylist在文件中的话怎么办
In [32]:
myfile = open('C:/Users/Jimmy/Desktop/1.txt','rb')
In [33]:
var = pickle.loads(obj)
In [34]:
var
Out[34]:
[1, 2, 3, 4, 5]
In [35]:
#先保存在内存中,或者先保存到文件中,都可以。
In [36]:
#同时二进制也是计算机计算最快的字符,所以不管是网站还是软件,都是这样。
In [37]:
#以上就是pickle模块存在的意义,也是我们这节课要学习的内容。
In [38]:
#当然,我们在打开文件的时候要使用’b‘权限打开,就是以二进制的形式。
以上就是我们这节课的内容,我们下节课再见!
本次只读课堂的python教程就到这了,欢迎下一次的收看!