序列化数据

常用的模块是pickle。

特点: 用C编写,速度快。

可以存储什么?

  1. 所有原生Python 数据结构 支持 布尔值,整数,浮点数,复数,字符串,对象,字节数组和None
  2. 任何原生类型的组合,列表、元组、字典、集合
  3. 第二条的任何嵌套(直至Python支持的最大嵌套级别)
  4. 函数、类、类的实例

使用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