No16.序列化模块

1、序列化

从数据类型转化为字符串的过程叫做序列化

从字符串转化为数据类型的过程叫做反序列化

2、序列化模块

  • json模块:只有很少一部分的数据类型能够通过json转化成字符串,数字、字符串、列表、字典、元组

# json.dumps序列化方法,json.loads反序列化方法,直接操作内存里的内容
import json
dic = {"k1":"v1"}
print(type(dic))
str_d = json.dumps(dic)  # 序列化
print(type(str_d), str_d)
dic_d = json.loads(str_d) # 反序列化
print(type(dic_d),dic_d)
>>>
<class 'dict'>
<class 'str'> {"k1": "v1"}
<class 'dict'> {'k1': 'v1'}


# dump load 往文件里面写,只能一次性的读和写
dic = {"k1":"v1", 1:'中国'}
f = open('fff', 'w', encoding='utf-8')
json.dump(dic, f, ensure_ascii=False) # ensure_ascii参数默认值是True,需改为False文件中才能看见中文,否则文件中显示的是编码
json.dump(dic, f, ensure_ascii=False)
f.close()

f = open('fff', encoding='utf-8')
res = json.load(f)
print(type(res), res)
f.close()
#################################################################
利用json模块一行一行的往文件里面写,思想:for循环每一个要写的内容,将每一个内容序列化后写进文件,每个要写的内容占一行,反序列化时一行一行的读取文件,一行一行的进行反序列化
l = [{'k1':1}, {'k2':2}, {'k3':3}]
f = open('file', 'w')
for dic in l:
    str_dic = json.dumps(dic)
    f.write(str_dic+'\n')
f.close()

f = open('file')
l = []
for line in f:
    dic = json.loads(line.strip())
    l.append(dic)
f.close()
print(l)

  • pickle模块:可以序列化任何类型,且支持分次load,与文件打交道的是能以bytes形式,所有的方法和json一样
import pickle

import pickle
dic = {'k1':'v1', 'k2':'v2', 'k3':'v3'}
str_dic = pickle.dumps(dic)  #序列化
print(str_dic) # 一串二进制内容
dic2 = pickle.loads(str_dic)  #反序列化
print(dic2)
>>>
b'\x80\x03}q\x00(X\x02\x00\x00\x00k1q\x01X\x02\x00\x00\x00v1q\x02X\x02\x00\x00\x00k2q\x03X\x02\x00\x00\x00v2q\x04X\x02\x00\x00\x00k3q\x05X\x02\x00\x00\x00v3q\x06u.'
{'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}


import time
struct_time = time.localtime(10000000000)
print(struct_time)
f = open('pickle_file', 'wb') # 只能以wb方式去写
pickle.dump(struct_time, f)
f.close()

f = open('pickle_file', 'rb') # 只能以rb的方式去读
struct_time2 = pickle.load(f)
print(struct_time2, struct_time)
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)
>>>
{'int': 10, 'float': 9.5, 'string': 'Sample data'}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值