python 序列化模块
一、介绍
1、分类
序列化:
数据类型->字符串
反序列化
字符串->数据类型
2、作用
文件传输和文件储存需要将数据类型转换成字符串
二、序列号模块分类
1、json
优点:编程语言中的英语,同用语言
缺点:数据类型少:数字、字符串、列表、字典、元祖(通过列表进行的)
2、pickle
优点:python的所有数据类型
缺点:不通用,只能在python中使用
3、shelve
优点:操作简单,只要使用序列化句柄操作即可
缺点:不成熟
三、json模块
1、dumps() 和 loads() 方法
import json dic = {'k1': 'v1'} """ dic->str,使用dumps()方法,在内存中序列化 str->dic,使用loads()方法,在内存中反序列化 """ str_d = json.dumps(dic) print(str_d, type(str_d)) dic_d = json.loads(str_d) print(dic_d, type(type)) """ 结果: {"k1": "v1"} <class 'str'> {'k1': 'v1'} <class 'type'> """
2、dump() 和 load() 方法
import json dic = {'k1': 'v1'} """ json.dump(数据, 文件),序列化 json.load(文件),反序列化 """ with open(file='abc', mode='w', encoding='utf-8') as f1: json.dump(dic, f1) with open(file='abc', mode='r', encoding='utf-8') as f1: ret = json.load(f1)print(ret, type(ret)) # {'k1': 'v1'} <class 'dict'>
3、在文件中,一行一行序列化,一行一行反序列化,必须用dumps()和loads()方法
import json li = [{'k1': 'v1'}, {'k2': 'v2'}, {'k3': 'v3'}] new_li = [] """ 1.使用dumps()方法,li->str,并写入文件-逐行写入 2.使用loads()方法,str->li,并读取文件-逐行读取 """ f = open('cv', mode='w', encoding='utf-8') for i in li: s = json.dumps(i) f.write(s + '\n') f.close() f1 = open('cv', mode='r', encoding='utf-8') for line in f1: s0 = json.loads(line.strip()) new_li.append(s0) print(li) f.close()
ensure_ascii 默认参数为 False时,可以写中文
四、pickle模块
1、用法和json模块相似
2、区别
1)在使用dump()和load()方法,序列化和反序列化时,文件的mode要加b
2)在使用dump()和load()方法时,文件可以逐行序列化和反序列化,json不可以
import pickle import time s_time1 = time.localtime(1000000000) s_time2 = time.localtime(2000000000) f = open('pickle_file1', 'wb') pickle.dump(s_time1, f) pickle.dump(s_time2, f) f.close() f = open('pickle_file1', 'rb') s_time1 = pickle.load(f) s_time2 = pickle.load(f) print(s_time1.tm_year) print(s_time2.tm_year) f.close()
五、shelve模块
不常用
import shelve f = shelve.open('shelve_file') f['key'] = {'int': 10, 'float': 9.5, 'string': 'Sample data'} # 直接对文件句柄操作,就可以存入数据 f.close() f1 = shelve.open('shelve_file') existing = f1['key'] # 取出数据的时候也只需要直接用key获取即可,但是如果key不存在会报错 f1.close() print(existing)
ps:涉及到反序列化的问题,用双引号