如何利用Python和pandas来处理json数据

在实际工作中,尤其是web数据的传输,我们经常会遇到json数据。它不像常见的文本数据、数值数据那样友好,而且它和python中的字典类型数据又很相像,给很多人造成了困扰。
本文结合具体案例详细介绍了如何利用python和pandas(python的第三方库)来处理json数据,主要内容包含:
json数据简介常用json数据转化网站json数据和python数据的转化pandas处理json数据1. json 简单介绍1.1 什么是json数据首先,我们看一段来自维基百科对json的解释:
json (javascript object notation,javascript对象表示法)是一种由道格拉斯·克罗克福特构想和设计、轻量级的资料交换语言,该语言以易于让人阅读的文字为基础,用来传输由属性值或者序列性的值组成的数据对象。
json 数据格式与语言无关。即便它源自javascript,但目前很多编程语言都支持 json 格式数据的生成和解析。文件扩展名是 .json。
通过上面的官方介绍,我们总结3点:
json是一种文本(资料)语言,超轻量级的数据交换格式json数据容易阅读,易读性强源自javascript,其他语言可解析json数据1.2 json数据类型json实际上是javascript的一个子集,json语言中仅有的6种数据类型或者它们之间的任意组合:
number:和javascript中的number一致boolean:javascript中的true或者falsestring:javascript中的stringnull:javascript中的nullarray:javascript的表示方式:[]object:javascript的{…}表示方式1.3 两点规定1、json语言中规定了字符集必须是utf-8
2、为了统一解析,json的字符串规定必须是双引号
2. 常用json数据转化网站1、json.cn:https://www.json.cn/
2、json菜鸟工具:https://c.runoob.com/front-end/53
3、sojson:https://www.sojson.com/,非常全的json处理网站
4、kjson:https://www.kjson.com/
5、编程狮-json检验工具:https://www.w3cschool.cn/tools/index?name=jsoncheck
6、jsonviewer:http://jsonviewer.stack.hu/,用于检测json格式是否正确的一个在线应用工具
3. json 和 dict 类型转化本小节主要讲解的json类型数据和python类型的转化。
json对象和python字典的转化主要使用的是内置json包,下面详细介绍该包的使用。详细的学习资料见官网:https://docs.python.org/3/library/json.html
首先使用的时候直接导入该包:
import jsonjson包中存在4中方法用来进行和python内置数据类型的转化:
方法作用
json.dumps() 将python对象编码成json字符串:字典到json
json.loads() 将json字符串解码成python对象:json到字典
json.dump() 将python中的对象转化成json储存到文件中
json.load() 将文件中的json的格式转化成python对象提取出来
笔记:两个和load相关的方法只是多了一步和文件相关的操作。
json.dumps和dump相关的两个函数是将python数据类型转成json类型,转化对照表如下:
pythonjson
dict object
list, tuple array
str, unicode string
int, long, float number
true true
false false
none null
json.dumps方法的作用是将python字典类型的数据转成json格式的数据,具体的参数如下:
json.dumps(obj, # 待转化的对象 skipkeys=false, # 默认值是false,若dict的keys内的数据不是python的基本类型(str,unicode,int,long,float,bool,none),设置为false时,就会报typeerror的错误。此时设置成true,则会跳过这类key ensure_ascii=true, # 默认是ascii码,若设置成false,则可以输出中文 check_circular=true, # 若为false,跳过对容器类型的循环引用检查 allow_nan=true, # 若allow_nan为假,则valueerror将序列化超出范围的浮点值(nan、inf、-inf),严格遵守json规范,而不是使用javascript等价值(nan、infinity、-infinity) cls=none, indent=none, # 参数根据格式缩进显示,表示缩进几个空格 separators=none, # 指定分隔符;包含不同dict项之间的分隔符和key与value之间的分隔符;同时去掉`: ` encoding=utf-8, # 编码 default=none, # 默认是一个函数,应该返回可序列化的obj版本或者引发类型错误;默认值是只引发类型错误 sort_keys=false, # 若为false,则字典的键不排序;设置成true,按照字典排序(a到z) **kw)通过例子来解释上面几个常见参数的作用
1、当我们的python类型数据中存在中文
information1 = { 'name': '小明', 'age': 18, 'address': 'shenzhen'}# 字典转成json数据information2 = json.dumps(information1)print(type(information1))print(type(information2))print(information2)
加上ensure_ascii=false参数即可显示中文:
# 字典转成json数据information3 = json.dumps(information1,ensure_ascii=false)
⚠️通过结果我们发现: json数据中全部变成了双引号,原来的字典类型数据中使用的是单引号 ,再看一个关于引号变化的例子:
>> > import json >> > print(json.dumps({'4': 5, '6': 7}, sort_keys=true, indent=4)) # python中的键是字符串,用单引号# 结果显示{ 4: 5, # 变成双引号 6: 7}2、对json数据通过缩进符美观输出,使用indent参数
information4 = { 'name': '小明', 'age': 18, 'skills': 'python', 'english': 'cet6', 'major': '会计', 'address': '深圳'}information5 = json.dumps(information4, ensure_ascii=false) # 不缩进information6 = json.dumps(information4, ensure_ascii=false, indent=2) # 缩进2个空格 information7 = json.dumps(information4, ensure_ascii=false, indent=5) # 缩进5个空格print(information5)print(information6)print(information7)
3、对python数据类型中键进行排序输出
information4 = { 'name': '小明', 'age': 18, 'skills': 'python', 'english': 'cet6', 'major': '会计', 'address': '深圳'}information8 = json.dumps(information4, ensure_ascii=false, indent=2) # information9 = json.dumps(information4, ensure_ascii=false, indent=2,sort_keys=true) # 键的排序设置成true print(information8)print(information9)
通过sort_keys=true的设置,可以观察到输出的结果进行了首写字母的排序;当首写字母相同,按照第二个字母再进行排序。
4、输出分隔符的控制
使用separators参数来设置不同的输出分隔符;不同的dic元素之间默认是,,键值对之间默认是:
information1 = { 'name': '小明', 'age': 18, 'address': 'shenzhen'}information2 = json.dumps(information1,ensure_ascii=false)information10 = json.dumps(information1,ensure_ascii=false,separators=('+','@')) # 改变分隔符print(information2) # 默认连接符print(information10)
json.dumpjson.dump功能和json.dumps类似,只是需要将数据存入到文件中,二者参数相同
我们尝试将下面的个人信息写入到文件中
information = { 'name': '小明', 'age': 18, 'skills': 'python', 'english': 'cet6', 'major': '会计', 'address': '深圳'}1、如果不使用indent参数,全部信息显示为一行
# 使用json.dump;json数据一定是双引号with open(information_1_to_json.json, w, encoding='utf-8') as f: # json.dump(dic_, f) # 全部写入一行数据,不换行 json.dump(information, # 待写入数据 f, # file对象 sort_keys=true, # 键的排序 ensure_ascii=false) # 显示中文看看实际的保存效果:
加入indent参数,会显示成多行数据:
with open(information_2_to_json.json, w, encoding='utf-8') as f: json.dump(information, f, indent=2, # 空格缩进符,写入多行 sort_keys=true, ensure_ascii=false)
json.loads和load相关的两个函数是将json转成python数据类型,转化对照表如下:
jsonpython
object dict
array list
string unicode
number (int) int, long
number (real) float
true true
false false
null none
json.loads的作用是将json格式的数据转成python字典类型的数据。
information1 = { 'name': '小明', 'age': 18, 'address': 'shenzhen'}# 字典转成json数据information3 = json.dumps(information1,ensure_ascii=false)information11 = json.loads(information3) # json转成字典数据print(information11)
json.load打开json文件再转成字典形式的数据
# 使用json.loadwith open(information_to_json.json,encoding=utf-8) as f: json_to_dict = json.load(f) # json转成字典print(json_to_dict)
4. json 和 非 dict 类型的转化上面介绍的主要是json格式数据和python字典之间的转化,下面讲解了python其他数据类型通过json.dumps方法转成json个数据:
1、元组转化
2、列表转化
3、布尔值转化
4、数值型数据转化
5. 利用 demjson 来解析demjson是python的第三方库,能够用于编码和解码json数据:
encode:将 python 对象编码成 json 字符串decode:将已编码的 json 字符串解码为 python 对象安装demjson直接使用pip install demjson安装,kan'dao看到如下界面表示安装成功。
使用demjson使用之前先进行导入:
import demjson # 导入包1、编码功能
2、解码功能
demjson包一个明显的缺点就是不能直接解析中文数据:
如果我们想看到中文数据,可以使用eval函数:
6. pandas处理 json下面介绍pandas库对json数据的处理:
read_json:从json文件中读取数据to_json:将pandas中的数据写入到json文件中json_normalize:对json数据进行规范化处理https://geek-docs.com/pandas/pandas-read-write/pandas-reading-and-writing-json.html
6.1 read_json首先看看官网中read_json的参数:
pandas.read_json( path_or_buf=none, # json文件路径 orient=none, # 重点参数,取值为:split、records、index、columns、values typ='frame', # 要恢复的对象类型(系列或框架),默认’框架’. dtype=none, # boolean或dict,默认为true convert_axes=none, convert_dates=true, keep_default_dates=true, numpy=false, precise_float=false, date_unit=none, encoding=none, lines=false, # 布尔值,默认为false,每行读取该文件作为json对象 chunksize=none, compression='infer', nrows=none, storage_options=none)详细的参数解析可以参考文章:https://blog.csdn.net/qq_41562377/article/details/90203805
假设我们现在有一份json数据,如下图所示:
我们将上面的数据读取进来,由于数据是比较规范的,所以直接填写文件路径即可读取:
重点讲解下参数orient:
1、oriden='split'
split’ : dict like {index - > [index], columns - > [columns], data - > [values]}json文件的key的名字只能为index,cloumns,data这三个,另外多一个key都不行,少一个也不行。举例说明:
2、orient='records'
‘records’ : list like [{column - > value}, … , {column - > value}]
3、orient='index'
dict like {index - > {column - > value}}
4、orient='columns'
dict like {column - > {index - > value}}
转置之后就是上面orient='index'的结果
5、orient='values'
‘values’ : just the values array
6.2 to_jsonto_json方法就是将dataframe文件保存成json文件:
df.to_json(个人信息.json) # 直接保存成json文件如果按照上面的代码保存,中文是没有显示的:
当然我们可以通过json.load将json文件再次读取进行,显示中文,我们也可以直接在保存的时候显示中文:
df.to_json(个人信息1.json,force_ascii=false) # 显示中文
6.3 json_normalizehttps://www.jianshu.com/p/a84772b994a0
上面介绍的json数据的保存和读取中json数据都是列表形式的;但是json文件中的数据通常不一定全部是列表形式,那么我们需要将字典结构的文件转成列表形式,这个过程就叫做规范化。
pandas中的json_normalize()函数能够将字典或列表转成表格,使用之前先进行导入:
from pandas.io.json import json_normalize通过官网和一个实际的例子来同时进行学习,首先看看官网的例子:
1、层级字典通过属性的形式显示数据:
2、如果加入max_level参数则会显示不同的效果:
若max_level=0,则嵌套的字典会当做整体,显示在数据框中
若max_level=1,则嵌套的字典会被拆解,里面的键会被单独出来:
3、读取层级嵌套中的部分内容:
4、读取全部内容
7. 总结一下json数据是工作中经常会遇到的一种数据格式,也是很重要的一种数据。
本文首先对json数据及格式进行了简介,重新认识json数据;其次,结合各种实际案例,将json和python的各种数据类型,尤其是字典类型进行了转化;最后,重要讲解了json数据的读取、写入和规范化的操作。

60 V第四代n沟道功率MOSFET:业内适用于标准栅极驱动电路的器件
发电单元是什么 发电单元平均可利用率
苏州寻迹智行:聚焦AGV设备市场,赋能企业智能升级
人工智能是如何改善物联网的
自动气象站的检测项目以及使用效果的介绍
如何利用Python和pandas来处理json数据
谷歌地图提供的功能远远超出了旧纸质地图
陆奇再次站在聚光灯下,终于确定了职业新走向
中芯国际:公司未来5-7年有共约34万片12吋新产线建设项目
LED视频处理器故障解决方法
消弧和消谐的工作原理详解
【EsDA应用】5分钟快速实现图像人脸检测
OnLeaks泄露了诺基亚7.3基于CAD的渲染,揭示了其设计
Synaptics推出超薄型区域触控指纹识别传感器
重磅!IBM发布全球首台独立量子计算机 或将对外出售
氨气检测仪的使用方法
16个查找物品不够?苹果Find My应用升级为可添加32个物品
基于LT8551相位扩展器构建高功率升压转换器
MediaTek召开 ”驾智能 驭未来”车用技术研讨会
蒸汽拖把好用吗?细菌、尘螨、灰尘它统统搞定!