是不是一直傻傻分不清楚dumps、dump、loads和load的关系,长痛不如短痛,今天索性就把它写明白,不懂得朋友,请看下面。
是不是一直傻傻分不清楚dumps、dump、loads和load的关系,长痛不如短痛,今天索性就把它写明白,不懂得朋友,请看下面。
这里我先回答一个很常见的问题,为什么 Python 会有四个操作 Json 的函数?按理说应该就只有两个的,一个解码,一个编码。
首先 Json 是一种数据格式,文件通常是以.json作为后缀,这种结构在互联网很是常见和方便。Python 这么牛逼,也想添加这个结构性的数据,所以 dict 字典数据类型就这么来了, dict 也是键和键值的结构,和 Json 几乎一致。
但是问题了,Json 文件这么的流行,Python 也需要支持 Json文件的读取和写入的,所以 json.load()和json.dump(),就这么被设计出来了。
但是随着Python爬虫的兴起,越来越多的 Python 爬虫需要处理网站抓取的 json 数据,进行处理转换为 Python 字典类型,但是现有的 load 和 dump 并不能解决这样的问题,所以此时 json.loads()和json.dumps() 隆重登场。
详细的介绍请看下方:
1、json.dumps()
import json
dict1 = {
'name': '西园公子',
'salary': '66666',
}
json_str = json.dumps(dict1) # 将字典格式 dict1 转为 Json 格式的字符串
print(f"json_str:{json_str}, json_str_type:{type(json_str)}")
# json_str:{"name": "\u897f\u56ed\u516c\u5b50", "salary": "66666"}, json_str_type:<class 'str'>
可能你会疑惑了,这个 dumps 貌似也没啥用,只是将 dict 转为 json格式的字符串。这里面一般有两个用处:
1、web后端和前端之间进行 json 数据的传输,Python 在后端就需要将字典转换成通用的 Json 格式 ,以便于前端对数据进行 Json 解码。另外在爬虫中也是常见
2、可以直接复制上面的 json_str 内容,直接新建一个以 .json 后缀的文件,将内容写入,就可生成一个 Json 文件,如果是这种用途的话可直接使用 json.dump(dict_data, fp) 一步到位。
细心的你会发现,我上面写的 dict1 中的键和键值,都是以单引号'进行包裹的,而在 json_str 中则是以双引号"。这是因为标准的 Json 文件语法中是以双引号包裹字符串的。
2、 json.loads()
对于一个 Json 数据,想转成 dict 类型,就需要用 json.loads(json_str), json字符串→ python对象(dict)。
import json
json_str2 = '{"name": "\u897f\u56ed\u516c\u5b50", "salary": "66666"}'
dict2 = json.loads(json_str2)
print(f"dict2:{dict2}, dict2_type:{type(dict2)}")
# 打印
# dict2:{'name': '西园公子', 'salary': '66666'}, dict2_type:<class 'dict'>
用处:主要用于解码,网络上的 Json 数据,然后转成 Python 的 dict 字典类型,爬虫网络居多。
在网络爬虫中,爬取的网页数据中的一些json数据含有大量的特殊字符串,如果使用 Replace 进行替换的话,效率很低,而且转字典时候,有很多错误。所以需要去除特殊字符串的库,import html
import requests
import html
live_page_html = requests.get(live_content_url, headers=headers, cookies=cookies).text
json_data = html.unescape(live_page_html)
复制代码
3、json.dump()
参数名解释
obj字典
fp文件句柄
ensure_ascii设置为False的话,数据会原样写入,设置为True则会编码成ASCII值,其中中文则是编码成 Unicode 值,类似’\xXX\xXX’这种
indent缩进的空格数,设置为非零值时,一般设置4,比较美观
将字典数据写入 json 文件中:
import json
data = {
'name': '西园公子',
}
with open('data.json', 'w') as f:
json.dump(data, f, ensure_ascii=False, indent=4)
# indent=4是默认以四行缩进,更美观
# ensure_ascii=False 表示
# 注意:json.dump()写入的数据不能是bytes类型,否则会报错
用处:将字典转换并写入到 Json 文件中,已达到生成本地 Json 文件的作用。
4、json.load()
用于读取本地 Json 文件的数据,将其转成 Python 的字典dict类型。
import json
with open('data.json', 'r') as f:
data_dict = json.load(f)
print(f"data_dict:{data_dict},type:{type(data_dict)}")
# 打印
# data_dict:{'name': '西园公子', 'salary': '66666'},type:dict
用处:读取本地 Json 文件中的数据,将数据转换为 Python 的字典格式,供其他函数调用。
总结:
说一下怎么区别这几个函数,按需求来:
如果你是想对本地的一个以 .json 为后缀的 Json 文件,进行读取或者写入的话,那么就用 json.load() 和 json.dump() 。
如果你想将网络上的 Json格式的数据,转为 Python 字典 dict格式 ,又或者是前端和后端之间进行 Json 数据的额传输,那么就需要使用 json.dumps() 和 json.loads()
另外也可以这样记(纯属自己为了好记而虚构的),Python 最先支持对 Json 文件的读取和写入,所以开发出 load、dump,但是后来随着爬虫的火爆,以及 Django、Flask 等框架的兴起,就必须要支持解析 web 端的 Json 数,但是已经有 load 和 dump 了,名字被占用了怎么办?就索性在后面加个 s ,就诞生了 json.dumps() 和 json.loads()。
至于怎么区别 load 和 dump ?就需要理解他的英文单词的意思了。load 是加载的意思,将 json 数据转为 Python 字典格式。 dump是倾倒的意思,将 Python 字典格式转为 Json 格式。
或者看下面的流程图:
总结:1、loads 和dumps:
graph LR
json格式的Python字符串-->|json.loads|python的字典格式
python的字典格式-->|json.dumps|json格式的Python字符串
2、load 和dump:
graph LR
json文件-->|json.load|python的字典dict格式
python的字典dict格式-->|json.dump|json文件
另外关于 load和dump还有很多高级的用法,这边并没有涉及,后面有机会会单独写一篇,下期再见~
全文详见:http://it-club.cn/post/269.html