python 序列化模块pickle及json

1.pickle
序列化:把不能够直接存储在文件中的数据类型变得可存储
反序列化:把文件中的数据拿出来再变回原来的数据
php
serialize
unserialize

文件的存储数据要么是字符串,要么是二进制字节流
python中所有数据类型都可以通过dump序列化和load反序列化

###dumps和loads
import pickle
##序列化列表
lst=[1,2,3,4,5]
res=pickle.dumps(lst)
print(res,type(res))
print(pickle.loads(res))
###序列化函数
def func():
	print('测试101')
res=pickle.dumps(func)
print(res)

print(pickle.loads(res))
pickle.loads(res)()

###序列化迭代器
it=iter(range(10))
res=pickle.dumps(it)
print(res)
print(pickle.loads(res))

##dump和load
##dump 把对象序列化后写入file-like object (文件对象)
dic={'cc':323,'dasds':343}
with open('test.txt',mode='wb') as fp:
	pickle.dump(dic,fp)

###load 把文件对象的内容取出,反序列化成原来的数据
with open('test.txt',mode='rb') as fp:
	print(pickle.load(fp))

###对比dumps和dump
dic={'cc':323,'dasds':343}
dic_b=pickle.dumps(dic)
with open('test.txt',mode='wb') as fp:
	fp.write(dic_b)
with open('test.txt',mode='rb') as fp:
	res=fp.read()
	dic_new=pickle.loads(res)
	print(dic_new)

2.json
所有编程语言都能够识别的数据类型格式叫做json,是字符串
能够通过json序列化成字符串的有如下类型:(int float bool str list dic None)

pickle 序列化成字节流
json 序列化成字符串

import json
##dumps 和 loads是一对,序列化成字符串
tup=(1,2,3,4,'我是','帅哥')
print(json.dumps(tup))
res=json.dumps(tup,ensure_ascii=False)
print(res)

dic={'1':2,'3':4,'我是':'帅哥','ahha':'das'}
print(json.dumps(dic))
print(json.dumps(dic,ensure_ascii=False,sort_keys=True))


###dump 和 load 是一对,用于文件的写入和读取操作
dic={'1':2,'3':4,'我是':'帅哥','ahha':'das'}
dic2={'1':1,'2':2}
###dump可以连续序列化写入
with open('test.json',mode='w',encoding='utf-8') as fp:
	json.dump(dic,fp)
	fp.write('\n')
	json.dump(dic2,fp)
	fp.write('\n')
##load不可以连续反序列读取,而是一次性读取进行反序列化,容易出错
##解决方法,使用loads一行一行进行读取反序列化
with open('test.json',mode='r',encoding='utf-8') as fp:
	for i in fp:
		res=json.loads(i)
		print(res)

3.json和pickle的区别
1.json模块序列化成字符串数据类型,所有编程语言都能识别(用于数据的交流)
但是仅限于(int float bool)(str list tuple dict None)
json不能连续load,只能一次性拿出所有数据

2.pickle模块序列化成二进制字节流bytes,(存储存储转换)
任何数据类型都可序列化,但仅用于python之间存储转换
pickle可以连续load,多套数据存储在一个文件

###pickle可以连续dump也可以连续load
import pickle
with open('test.pk1',mode='wb') as fp:
	pickle.dump(dic,fp)
	pickle.dump(dic2,fp)
###方法一
with open('test.pk1',mode='rb') as fp:
		res=pickle.load(fp)
		res1 = pickle.load(fp)
		print(res,res1)

###方法二:
print('=========================')
'''try...except... 阻断报错 try里面内容报错时,执行except的内容'''
try:
	with open('test.pk1', mode='rb') as fp:
		while True:
			res=pickle.load(fp)
			print(res)
except:
	pass
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值