Python序列化模块的使用(json和pickle)

Python 序列化模块

序列化

将原本的列表或字典等内容转换为字符串的过程叫做序列化

​比如python中,我们想将代码计算出的数据给另外一段程序使用,怎么做?

现在想到的办法就是将,数据保存到文件中,然后另外一段程序再从文件中读取出来。

但是,都知道文件是没有字典这个概念的,所以我们只能转换为字符串然后存储的文件中

你可能会想str({‘a’:2,‘b’:4})不就好了,转换为字符串容易,但是如果从文件中读出来的字符串需要转换为字典呢,就不好办了吧

序列化的目的

  1. 已某种存储形式使自定义类型对象持久化(文件保存与读取)
  2. 将一个对象从一个地方传递给另一个地方(网络传输)
  3. 使程序更具维护性

在这里插入图片描述

json模块(适用于大多数语言:前后端交互(C,C#,Java,Go,Python)

在这里插入图片描述

JSON支持数据类型:

1.对象(字典)。使用{}

2.数组(列表)。使用[]

3.整型,浮点型,布尔类型,NULL类型

4.字符串类型(注意:JSON中必须用双引号,而不是单引号)

不支持集合,元组等

多个数组间用逗号分隔

注意:JSON本质就是一个字符串

json提供了4种方法

dumps(序列化):
  • 作用:将python中的字典,加载成json字符串
  • dumps代码:
import json # 导入json模块

# dumps
dit = {3:{4:'c'},'a':'n'}  # 一个自定义的字典
ret = json.dumps(dit)  # 使用方法dump,将传进来的字典转换层字符串
print(ret)
print(type(ret))

# 结果:全都用双引号括起来了,可以看到他的类型是str类型的
{"3": {"4": "c"}, "a": "n"}
<class 'str'>
loads(反序列化):
  • 作用:将json字符串,转换为python数据类型
  • 代码 如下:
# loads
str_dic = '{"3": {"4": "c"}, "a": "n"}'
ret = json.loads(str_dic)  # 转换为python数据类型
print(ret)
print(type(ret))

# 结果:全都用双引号括起来了,可以看到他的类型是str类型的
{'3': {'4': 'c'}, 'a': 'n'}
<class 'dict'>
dump(序列化)
  • 作用:这个函数可以传入一个文件指针,直接将字符串dump到文件中。

  • 注意:默认会将中文转换为Unicode字符,ensure_ascii默认为True,需改为False

  • 代码如下:

# dump
json_lst = [{'username': '马海阳', 'age': 18, 'country': 'china'}, {'username': '333', 'age': 19, 'country': 'china'}]

with open('json3.txt',mode='w',encoding='utf8') as fp:
    json.dump(json_lst,fp) # dump方法接收一个文件句柄,直接将字典转换成json字符串写入文件
    
#结果:
cat .\json3.txt
[{"username": "\u9a6c\u6d77\u9633", "age": 18, "country": "china"}, {"username": "333", "age": 19, "country": "china"}]
load
  • 作用:与dump函数相反,是把文件中的json字符串,转换成python数据类型打开,实例代码如下:
  • 代码如下:
with open('json3.txt',encoding='utf8') as fp:
    ret = json.load(fp)   #load方法接收一个文件句柄,直接将文件中的json字符串转换成数据结构返回
    print(ret)
    print(type(ret))
    
# 结果
[{'username': '马海阳', 'age': 18, 'country': 'china'}, {'username': '333', 'age': 19, 'country': 'china'}]
<class 'list'>

pickle:支持几乎所有python的数据类型

简介:

  • python语言中特有的序列化模块

方法:

与json的使用方法基本相同

dumps和loads
import pickle
dic = {'北京': {'朝阳', '昌平'}, ('天津', '河北'): [1, 2, 3]}
ret = pickle.dumps(dic)  # 特性:会序列化为一个bytes格式
print(ret)
dec = pickle.loads(ret)
print(dec) 

# 结果:
b'\x80\x03}q\x00(X\x06\x00\x00\x00\xe5\x8c\x97\xe4\xba\xacq\x01cbuiltins\nset\nq\x02]q\x03(X\x06\x00\x00\x00\xe6\x9c\x9d\xe9\x98\xb3q\x04X\x06\x00\x00\x00\xe6\x98\x8c\xe5\xb9\xb3q\x05e\x85q\x06Rq\x07X\x06\x00\x00\x00\xe5\xa4\xa9\xe6\xb4\xa5q\x08X\x06\x00\x00\x00\xe6\xb2\xb3\xe5\x8c\x97q\t\x86q\n]q\x0b(K\x01K\x02K\x03eu.'
{'北京': {'朝阳', '昌平'}, ('天津', '河北'): [1, 2, 3]}
dump和load
# 和json.load json.dump一样都是操作文件句柄,写入文件和读进内存,写入文件的bytes字节,只供保存调用
dic = {'北京': {'朝阳', '昌平'}, ('天津', '河北'): [1, 2, 3]}
with open('pickle_file','wb') as f:
    pickle.dump(dic,f)

# 读取文件中的内容,转换成对应格式加载进内存中
with open('pickle_file', 'rb') as f:
    ret = pickle.load(f)
    print(ret)

pickle和json的区别

  • pickle 支持python中的几乎所有数据类型,但是只能python一种语言中使用

  • json 支持所有的语言,但只支持有限的数据类型

json和pickle的总结

  • json

    json类型 : ‘{“key”:[1,2,3]}’

    所有语言通用的\支持的数据类型有限

    序列化的结果是字符串 : 可视化

    json不支持多次dump

  • pickle

    python自己用\支持python中几乎所有的数据类型

    结果是二进制 :看不懂的

    pickle天生支持多次dump和load

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值