0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

科技绿洲 来源:Python实用宝典 作者:Python实用宝典 2023-11-01 10:59 次阅读

在实际工作中,尤其是web数据的传输,我们经常会遇到json数据。它不像常见的文本数据、数值数据那样友好,而且它和Python中的字典类型数据又很相像,给很多人造成了困扰。

本文结合具体案例详细介绍了如何利用Python和pandas(Python的第三方库)来处理json数据,主要内容包含:

  • json数据简介
  • 常用json数据转化网站
  • json数据和Python数据的转化
  • pandas处理json数据

1. JSON 简单介绍

1.1 什么是json数据

首先,我们看一段来自维基百科对json的解释:

JSONJavaScript 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或者false
  • string:JavaScript中的string
  • null:JavaScript中的null
  • array: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 json

json包中存在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
dictobject
list, tuplearray
str, unicodestring
int, long, floatnumber
Truetrue
Falsefalse
Nonenull

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等价值(nanInfinity、-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.dump

json.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
objectdict
arraylist
stringunicode
number (int)int, long
number (real)float
trueTrue
falseFalse
nullNone

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.load

with 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 来解析

DemjsonPython的第三方库,能够用于编码和解码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_json

to_json方法就是将DataFrame文件保存成json文件:

df.to_json("个人信息.json")   # 直接保存成json文件

如果按照上面的代码保存,中文是没有显示的:

图片

当然我们可以通过json.load将json文件再次读取进行,显示中文,我们也可以直接在保存的时候显示中文:

df.to_json("个人信息1.json",force_ascii=False)   # 显示中文

图片

6.3 json_normalize

https://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数据;其次,结合各种实际案例,将jsonPython的各种数据类型,尤其是字典类型进行了转化;最后,重要讲解了json数据的读取、写入和规范化的操作。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据
    +关注

    关注

    8

    文章

    7015

    浏览量

    88996
  • 网站
    +关注

    关注

    2

    文章

    258

    浏览量

    23159
  • python
    +关注

    关注

    56

    文章

    4795

    浏览量

    84663
  • JSON
    +关注

    关注

    0

    文章

    117

    浏览量

    6964
收藏 人收藏

    评论

    相关推荐

    Python利用pandas读写Excel文件

    使用pandas模块读取Excel文件可以更为方便和快捷。pandas可以将Excel文件读取为一个DataFrame对象,方便进行数据处理和分析。
    的头像 发表于 12-16 11:22 1348次阅读
    <b class='flag-5'>Python</b><b class='flag-5'>利用</b><b class='flag-5'>pandas</b>读写Excel文件

    Python存储数据详解

    Python开发中,数据存储、读取是必不可少的环节,而且可以采用的存储方式也很多,常用的方法有json文件、csv文件、MySQL数据库、Redis
    发表于 03-29 15:47

    python数据分析的类库

    ,因为它太重要了.Pandas库提供了我们很多函数,能够快速的方便的,处理结构化的大型数据,不夸张的说,Pandas是让Python成为强大
    发表于 05-10 15:18

    pandas对babynames数据集的简单处理

    利用Python进行数据分析——第二章 引言(2):利用pandas对babynames数据集进
    发表于 08-09 12:58

    pandas和seaborn绘图方法

    利用Python进行数据分析》 92 使用pandas和seaborn绘图
    发表于 10-28 10:25

    Python机器学习入门之pandas的使用提示

    系列文章目录提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加例如:第一章 Python 机器学习入门之pandas的使用提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助
    发表于 08-13 07:36

    Python中高效使用JSON的四种方法

    字典和列表是 Python的两种数据类型,也是用来处理JSON的完美工具。本文将主要分享以下内容:如何载入、编写JSON?如何在命令行上优化
    的头像 发表于 09-14 15:17 2730次阅读
    在<b class='flag-5'>Python</b>中高效使用<b class='flag-5'>JSON</b>的四种方法

    Python工具pandas筛选数据的15个常用技巧

    pandasPython数据分析必备工具,它有强大的数据清洗能力,往往能用非常少的代码实现较复杂的数据处理 今天,总结了
    的头像 发表于 03-30 10:44 2887次阅读
    <b class='flag-5'>Python</b>工具<b class='flag-5'>pandas</b>筛选<b class='flag-5'>数据</b>的15个常用技巧

    Python中三个json组件的安装方式

    Python 使用用 json.dumps(data) 时突然发现特别慢,data 本身不大,但是一个包含很多元素的列表,所以促使本人寻找一个替代的 JSON 处理库。大概对比了一
    的头像 发表于 09-23 14:35 6128次阅读
    <b class='flag-5'>Python</b>中三个<b class='flag-5'>json</b>组件的安装方式

    详解Python中的Pandas和Numpy库

    pandas、numpy是Python数据科学中非常常用的库,numpy是Python的数值计算扩展,专门用来处理矩阵,它的运算效率比列表更
    的头像 发表于 05-25 12:49 2586次阅读

    怎么用C+JS结构来处理JSON数据

    在物联网产品的开发过程中,对JSON格式的数据处理是一个强需求,例如亚马逊的 AWS IOT平台,设备与后台之间的通讯数据都是JSON格式,
    的头像 发表于 02-14 13:46 776次阅读
    怎么用C+JS结构<b class='flag-5'>来处理</b><b class='flag-5'>JSON</b><b class='flag-5'>数据</b>?

    如何利用Dataloder来处理加载数据

    在Pytorch中,torch.utils.data中的Dataset与DataLoader是处理数据集的两个函数,用来处理加载数据集。通常情况下,使用的关键在于构建dataset类。
    的头像 发表于 02-24 10:42 590次阅读
    如何<b class='flag-5'>利用</b>Dataloder<b class='flag-5'>来处理</b>加载<b class='flag-5'>数据</b>集

    Python Pandas如何来管理结构化数据

    Python Pandas是一个为Python编程提供数据操作和分析功能的开源工具包。这个库已经成为数据科学家和分析师的必备工具。它提供了一
    的头像 发表于 05-25 11:22 685次阅读
    <b class='flag-5'>Python</b> <b class='flag-5'>Pandas</b>如何来管理结构化<b class='flag-5'>数据</b>

    PandasPython中最好的数据分析工具

    Pandas绝对是Python中最好的数据分析工具,不接受反驳。 本文将展示如何美化 Pandas DataFrame 中的数字,并使用一些更高级的
    的头像 发表于 10-31 10:47 497次阅读
    <b class='flag-5'>Pandas</b>:<b class='flag-5'>Python</b>中最好的<b class='flag-5'>数据</b>分析工具

    PandasPython中强大方便的绘图功能

    PandasPython中非常常用的数据处理工具,使用起来非常方便。由于建立在NumPy数组结构之上,所以它的很多操作通过NumPy或者Pandas自带的扩展模块编写,这些模块用Cy
    的头像 发表于 11-03 11:04 515次阅读
    <b class='flag-5'>Pandas</b>:<b class='flag-5'>Python</b>中强大方便的绘图功能