python模块之pickle、shelve、json
<h1 id="一-什么是序列化">一 什么是序列化 序列化指的是将内存中的数据结构转化为一种中间格式,并存储到硬盘上。 (反序列化:将硬盘上存储的中间格式数据再还原为内存中的数据结构)
需知一个软件/程序的运行就是处理一系列状态的变化,在编程语言中,‘状态‘会以各种有结构的数据类型(也可以称之为变量)的形式保存在内存中。 内存是无法永久保存数据的,当程序运行了一段时间,我们断电或者重启程序,内存中关于这个程序之前一段时间的数据都会被清空。 在断电或重启程序之前将程序当前运行的数据保存下来,便于下次程序执行能够从文件中载入之前的数据,然后继续执行,这就是序列化。
序列化数据之后,不仅可以把序列化后的内容写入硬盘,还可以通过网络传输到别的机器上,如果收发的双方约定都使用一种序列化的格式,那么便打破了平台和语言带来的限制,实现了跨平台交互。 反过来,把变量内从从序列化的对象重新读到内存里称之为反序列化,即unpicking。 pickle模块时python内置的用来序列化python数据格式的模块,支持序列化python中所有的数据类型,主要方法有四个;
import pickle name = 'musibii' age = 18 height = 1.7 user = {'name': name,'age': age,'height': height} with open('userinfo.pkl','wb') as f: userbytes = pickle.dumps(user) f.write(userbytes)
import pickle with open('userinfo.pkl','rb') as f: userbytes = f.read() user = pickle.loads(userbytes) print(user) 与dumps和loads对应的两个方法更简单。
import pickle with open('userinfo.pkl','wb') as f: pickle.dump(user,f)
import pickle with open('userinfo.pkl','rb') as f: user = pickle.load(f) print(user) shevlve模块也用于序列化,它和pickle模块不同的地方在于,不需要关心文件模式,直接把数据当成字典来看待。而且shelve模块可以直接对数据进行修改,而不用覆盖之前的数据,但pickle要想修改的话只能使用wb模式覆盖 shelve只有一个方法open,所以使用起来也很方便。同样的,shelve也支持python中所有的数据格式。 import shelve user = {'name': 'musibii'} s = shelve.open('userdb.shv') s['user'] = user s.close() JSON是Java script object notation的缩写,翻译过来就是js对象标识法。 对于开发者而言,json是一种通用的数据格式,任何语言都能解析,所以每种语言都会有处理json格式数据的需求。
最外层通常是一个字典或列表 {}or[],如果想定义json格式的数据,那么最外层直接写{},而且json中的字符串必须是双引号,json理论上可以嵌套任意多的层次。 虽然之前的pickle和shelve都很强大,而且使用也非常方便,那么为什么还出来json呢?这是因为pickle和shevle序列化之后的数据只有python才能解析出来,而通常在实际生产开发中,都是需要数据可以跨平台使用的。 json模块的核心方法
不带s的直接封装了write和read方法。
import json jsontext = """{ "users": [{ "name": "musibii","age": 18 },{ "name": "thales","age": 23 } ] }""" with open('a.json','wt',encoding='utf-8') as f: json.dump(jsontext,f)
import json jsontext = """{ "users": [{ "name": "musibii",encoding='utf-8') as f: f.write(json.dumps(jsontext))
import json with open('a.json','rt',encoding='utf-8') as f: print(json.load(f))
import json with open('a.json',encoding='utf-8') as f: res = json.loads(f.read()) print(res) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |