序列化模块
- 什么叫序列化
- 原本的字典、列表等内容转换成一个字符串的过程就叫做__序列化__
- 初级认为:数据类型-->字符串
- 序列化的目的
- 储存:以某种存储形式使自定义对象持久化;
- 传输:将对象从一个地方传递到另一个地方。
- 维护:使程序更具维护性。
- 反序列化
- 字符串-->其他数据类型
01. json模块 -很重要
- 通用的序列化格式
- 通用:适用于各种编程语言
- 兼容:只有很少的数据类型能够通过json转换
- 列表
- 字典
- 元组
- 字符串
- 数字
直接操作内存中的数据类型
-
json.dumps()
序列化 -
jsom.loads()
反序列化import json dic = {'k1': 'v1'} str_d = json.dumps(dic) #序列化 print(type(str_d), str_d) #结果 <class 'str'> {"k1": "v1"} str_d = json.load(str_d) #反序列化 print(type(str_d), str_d) #结果 <class 'dict'> {'k1': 'v1'}
和文件相关的方法
json.dump()
向文件里写-
一次性写进去
import json
dic = {'k1':'v1'}
f = open('file.txt', 'w', encoding='utf-8')
json.dump(dic, f) #先将字典序列化后写入文件
f.close()
-
json.load()
向文件外读取-
一次性读出来
import json
f = open('file.txt', encoding='utf-8')
dic = json.load(f)
f.close()
-
- 中文情况
json.dump(dic, f, ensure_ascii=False)
ensure_ascii=False
可以防止中文字符写入文件编程bytes类型数据
分步向文件写入
import json
list = [{'k1':v1}, {'k2':v2}, {'k3':v3}]
for i in list:
f = open('file', 'w', encoding='utf-8')
f.write(json.dumps(i) + '
')
f.close()
分步从文件中读取
import json
f = open('file')
for line in f:
print(json.loads(line.strip()))
02. pickle模块 -重要
- 广泛:所有的python数据类型都能转换
- 限制:所有序列化的数据也只有python能解析
- 用法同
json
,用法一模一样 - 序列化之后是bytes数据类型
dump()
和load()
需要文件采用wb
或者rb
才能操作文件
- 可以分步
dump()
和load()
-
分步写入必须分步读取
-
先写先读
import pickle l1 = ['1', '2'] l2 = ['a', 'b'] #写入 f = open('file', 'wb', encoding='utf-8') pickle.dump(l1, f) #第一个数据导入 pickle.dump(l2, f) #第二个数据导入 f.close() #读取 f = open('file', 'rb', encoding='utf-8') l1 = pickle.load(f) #读取第一个数据 l2 = pickle.load(f) #读取第二个数据 f.close()
-
03. shelve模块 -一般
-
只有一个
shelve.open()
方法,要结合.close()
使用#导入shelve模块 import shelve #写入数据 f = shelve.open('file', flag='w') #打开文件,没有自动创建 f['name'] = '李王' #指定f[key]直接赋值数据就行 f.close() #关闭文件句柄 #读取数据 f = shelve.open('file', flag='r') #打开文件,没有自动创建 shelve_name = f['name'] #指定f[key]直接读取数据就行 print(shelve_name)#打印结果 f.close() #关闭句柄
-
writeback=True
参数,修改已经写入的数据时需要加入,要不然无法感知文件修改#不写入参数 import shelve f = shelve.open('file', flag='w') #没有添加writeback参数 f['key'] = {} f['key']['new_key'] = 'new_str' f.close() #读取 f = shelve.open('file', flaf='r') print(f['key']['new_key']) #结果 {} KeyError: 'new_key' #提示找不到'new_key',说明没有写入新数据 #写入参数 import shelve f = shelve.open('file', flag='w', writeback=True) #添加writeback参数 f['key'] = {} f['key']['new_key'] = 'new_str' f.close() #读取 f = shelve.open('file', flag='r') print(f['key']) print(f['key']['new_key']) f.close() #结果 {'new_key': 'new_str'} new_str