文章目录
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解析——点我