序列化数据
常用的模块是pickle。
特点: 用C编写,速度快。
可以存储什么?
- 所有原生Python 数据结构 支持 布尔值,整数,浮点数,复数,字符串,对象,字节数组和None
- 任何原生类型的组合,列表、元组、字典、集合
- 第二条的任何嵌套(直至Python支持的最大嵌套级别)
- 函数、类、类的实例
使用pickle 写入
1
2
3
4
5
6
7
8
9
10
11
12
13
|
>>> shell
1
>>> entry = {}
>>> entry['title'] = 'Dive into history, 2009 edition'
>>> entry['article_link'] = 'http://diveintomark.org/archives/2009/03/27/dive-into-history-2009-edition'
>>> entry['comments_link'] = None
>>> entry['internal_id'] = b'\xDE\xD5\xB4\xF8'
>>> entry['tags'] = ('diveintopython', 'docbook', 'html')
>>> entry['published'] = True
>>> import time
>>> entry['published_date'] = time.strptime('Fri Mar 27 22:20:42 2009')
>>> entry['published_date']
time.struct_time(tm_year=2009, tm_mon=3, tm_mday=27, tm_hour=22, tm_min=20, tm_sec=42, tm_wday=4, tm_yday=86, tm_isdst=-1)
|
将entry 装入 pickle
1
2
3
4
5
|
>>> shell
1
>>> import pickle
>>> with open('entry.pickle', 'wb') as f: ②
... pickle.dump(entry, f)
|
dump 函数接受一个可序列化的Python 数据结构。
使用最新版的pickle协议将其序列化成二进制的Python特定格式,将其保存到文件f中
读出
1
2
3
|
import pickle
with open('entry.pickle','rb') as:
entry = pickle.load(f)
|
load这个函数需要一个stream对象,从stream中读取数据,创建一个新的Python对象,在新的Python对象中重新创建序列化数据,
如果在不同的终端下进行上面的这样的操作。
每个entry 内容相同,但不是同一个。
也就是说,每一次都会从内存重新创建序列化数据。每一个都是复制品
如果不保存到文件,仅仅作为内存中的字节对象,结果是不是相同的呢?
1
2
3
4
5
6
7
8
|
>>> b = pickle.dump(entry)
>>> type(b)
<class 'types'>
>>> entry3 = pickle.load(b)
>>> entry3 == entry
True
>>> entry3 is entry
False
|
JSON module
首先Json 是基于文本的,并不想pickle 基于二进制的
saving data to a json file
1
2
3
4
|
basic= {'1':'2','dsa':'13'}
import json
with open('file.json','w') as f:
json.dump(basic,f)
|
dump 方法还有个可选的参数 indent
1
2
3
4
5
|
basic= {'1':'2','dsa':'13'}
import json
with open('file.json','w') as f:
json.dump(basic,f, indent = 2)
# indent 就是缩进符
|
Mapping of Python Datatype to Python