python序列化-pickle与json

pickle与json序列化


序列化介绍

序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。-- 来源:百度百科
通俗点讲,就是将内存中的数据保存到硬盘里以便以后调用。内存中的数据,程序结束、断电就丢失了。
在pandas模块中,如果我们只想临时保存数据以便以后调用,我们可以使用to_pickle将DataFrame或Series保存为二进制文件,二进制文件读取速度往往快于其他格式;机器学习监督学习的模型训练通常需要耗费不少时间,我们可以将模型序列化保存到本地,便于以后调用;网络爬虫中,有的网页可能返回js字符串,我们可以用过json模块字符串反序列化,将其转为python字典类型,便于数据提取…


pickle与json区别

  • JSON 是一个文本序列化格式(它输出 unicode 文本,尽管在大多数时候它会接着以 utf-8 编码),而 pickle 是一个二进制序列化格式;
  • JSON是人类可读的,而pickle则不是;
  • JSON是可互操作的,并且在Python生态系统之外广泛使用,而pickle是特定于Python的;
  • 默认情况下,JSON只能表示Python内置类型的子集,而不能表示自定义类; pickle可以表示极其庞大的Python类型(其中许多是自动的,通过巧妙地使用Python的内省工具;复杂的案例可以通过实现特定的对象API来解决)。

  • 导入模块
import json
import pickle

pickle方法

pickle.dump

将obj的pickled表示写入打开的文件对象 文件。

ls = [1,2,3,4]
with open('d:/桌面/data','wb') as f:
	pickle.dump(ls, f)
``
### pickle.dumps
将对象的pickled表示作为bytes对象返回,而不是将其写入文件。
```python
ls = [1,2,3,4]
pickle_ls = pickle.dumps(ls)
print(pickle_ls)
#out: b'\x80\x03]q\x00(K\x01K\x02K\x03e.'

pickle.load

与dump方法相反地,从打开的文件对象 文件中读取pickle对象表示,并返回其中指定的重构对象层次结构。

with open('d:/桌面/data','wb') as f:
	ls = pickle.load(f)
print(ls)
#out: [1, 2, 3]

pickle.loads

与dumps方法相反,loads从bytes对象读取pickle对象层次结构并返回其中指定的重构对象层次结构。

ls = pickle.loads(pickle_ls)
print(ls)
#out: [1, 2, 3]

json方法

  • json本质是一个字符串,多个数据,逗号间隔。
  • 同pickle模块一样,json模块也拥有以上四种方法,其中load和dump方法面向文件对象。
  • js支持的数据格式:
    • 对象(字典):使用花括号
    • 数组(列表):使用方括号
    • 整形、浮点型、布尔类型还有null类型
    • 字符串类型(字符串必须要用双引号,不能用单引号)

json.dumps

dic = {'姓名':'张三','年龄':25}
json.dumps(dic)
#out: '{"\\u59d3\\u540d": "\\u5f20\\u4e09", "\\u5e74\\u9f84": 25}'		默认是ascill编码

'''ensure_ascii=False:显示中文;indent = 4:间隔美化'''
json.dumps(dic,ensure_ascii=False,indent = 4)
#out: '{\n    "姓名": "张三",\n    "年龄": 25\n}'

js.loads

json_test = str({"姓名":"张三"})
#out: "{'姓名': '张三'}"
json.loads(json_test)
#out: json.decoder.JSONDecodeError	js使用字符串都是双引号,单引号无法识别。

json_test = json_test.replace("'",'"')		# 把单引号替换成双引号
json.loads(json_test)		# 我们再试一次
#out: {'姓名': '张三'}	成功转化为字典,没问题。

json_str = '{"姓名":"张三"}'
json.loads(json_str)
#out: {'姓名': '张三'}	转化成了python的字典类型

json.load

with open('a.js','r',encoding='utf-8') as f:
	js_str = js.load(f)		#从文件中加载js对象转化为python数据类型。

json.dump

with open('a.js','w',encoding='utf-8') as f:
	json.dump(f,json)	# 把js数据写入f文件中。

json注意事项

json中使用字符串都是双引号引起来的,如果不是双引号,可以使用eval:能实现简单的字符串和python类型的转化。或可以利用字符串replace方法替换下引号(如上)。eval函数:将字符串解析成表达式运算并返回。

d = {'姓名':'张三','年龄':18}
s = str(d)
print(s)
#out: "{'姓名': '张三', '年龄': 18}"		变成了字符串,引号不符合js规范
print(eval(s))
#out: {'姓名': '张三', '年龄': 18}		使用eval函数将字符串转化成字典

往一个文件中写入多个json串,不再是一个json串,不能直接读取;可以一行写一个json串,按照行来读取。
jsonloads读取报错时,先将json字符串写入到本地,再查看原因(比如引号问题,js字符串前面还有其他需要去除的多余字符等)。


分享一个js、xml解析网站,可以清晰地查看其结构
JS、XML解析——点我

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值