Python中优雅处理JSON⽂件的⽅法实例
⽬录
1. 引⾔
2. 什么是JSON⽂件?
3. 使⽤Python处理JSON⽂件
3.1. 将JSON⽂件读取为字典类型
3.2. 将JSON⽂件读取为Pandas类型
3.3. 使⽤Pandas读取嵌套JSON类型
3.4. 访问特定位置的数据
3.5. 导出JSON
3.6. 格式化输出
3.7. 输出字段排序
4.总结
5.参考
1. 引⾔
在本⽂中,我们将学习如何使⽤Python读取、解析和编写JSON⽂件。
我们将讨论如何最好地处理简单的JSON⽂件以及嵌套的JSON⽂件,当然我们也将讨论如何访问Json⽂件数据中的特定值。
2. 什么是JSON⽂件?
JSON(Java Script Object Notation)是⼀种流⾏的⽂件格式,主要⽤于在web应⽤程序中存储和传输数据。如果我们经常和数据打交道,那么⼀定或多或少遇到过JSON格式的⽂件,因此我们有必要来学习如何读取和写⼊JSON。
下图为常见的JSON⽂件结构的⽰例.
JSON结构看起来和Python中的字典⾮常类似。需要注意的是,JSON格式通常是由key: 结对组成,其中key是字符串形
式,value是字符串、数字、布尔值、数组、对象或null。
为了更直观的进⾏说明,在下图中我们以蓝⾊突出显⽰了所有的key,同时以橙⾊突出显⽰了所有的value。请注意,以下每组key/value间均使⽤逗号进⾏区分。
3. 使⽤Python处理JSON⽂件
在Python中内置了⽤于读取JSON⽂件的函数。以下给出⼏个如何将JSON⽂件解析为Python对象的⽰例。
3.1. 将JSON⽂件读取为字典类型
⾸先我们需要导⼊ json库, 接着我们使⽤open函数来读取JSON⽂件,最后利⽤json.load()函数将JSON字符串转化为Python字典形式.
就这么简单,代码如下:
1 2 3 4 5 6 7import json
with open('superheroes.json') as f:
superHeroSquad =json.load(f)
print(type(superHeroSquad))  # Output: dict
print(superHeroSquad.keys())
# Output: dict_keys(['squadName', 'homeTown', 'formed', 'secretBase', 'active', 'members'])
上述代码很简单很直观啦,唯⼀需要注意的是json库中有load()和loads()两个函数.
函数load()作⽤为读取JSON⽂件⽣成Python对象函数loads()作⽤为读取JSON 字符串流⽣成Python对象我们可以将loads()函数中的字符s的含义理解成 load for strings.
3.2. 将JSON⽂件读取为Pandas类型
当然我们也可以使⽤Pandas库中的 read_json函数来读取对应的JSON⽂件,
代码如下:
1import pandas as pd
运⾏结果如下:
需要注意的是使⽤Pandas库不仅仅可以读取电脑本地磁盘上的JSON⽂件,也可以通过URL读取⽹络上存放的⽂件.
代码如下:
3.3. 使⽤Pandas读取嵌套JSON类型
我们有时候遇到的JSON⽂件是嵌套的,这经常会让读取⼯作变得有些困难. 其实嵌套JSON和Python中的嵌套字典思想类似,即字典中嵌套字典.
我们观察上述例⼦中的member字段,其值也为字典类型,下图中我们使⽤缩进来展⽰嵌套结构。
设想⼀下,当我们将JSON⽂件加载到Pandas数据框架中时,members列如下所⽰。每⾏包含⼀个字典。
接下来我们讨论两种实现⽅法,这两种⽅法中,我们可以解析数据,以便将每个键分解为单独的⼀列。
⽅案⼀
我们可以在members这⼀列上使⽤apply⽅法,代码如下:
上述代码执⾏后,
members列会被拆分为4个新列,如下所⽰:
当然如果你想将上述拆分后的结果和之前的结果进⾏合并,可以使⽤pd.concat函数,
代码如下:
1)], axis =1)
⽅案⼆
在Pandas库中还有⼀个函数 json_normalize() ,它允许我们把嵌套的JSON展开。这是最简单的⽅法来解析嵌套的JSON了。代码如下:
1 2 3 4 5def test2():
with open('superheroes.json') as f:
superHeroSquad =json.load(f)
out =pd.json_normalize(superHeroSquad, record_path=['members'],
meta=['squadName', 'homeTown', 'formed', 'secretBase', 'active'])    print(out)
上述代码中:
record_path 为我们希望拆分的列的名字
meta 为列名的list ,为我们输出的次序
运⾏结果如下:
最后我们需要注意的是,我们可以在上述函数json_normalize 中添加参数 meta_prefix ,这样可以让我们对meta 中的名字添加统⼀的前缀。
代码如下:
123
js获取json的key和value
pd.json_normalize(superHeroSquad,
record_path = ['members'],
meta = ['squadName', 'homeTown', 'formed', 'secretBase', 'active'],
meta_prefix = 'members_')
运⾏结果如下:
3.4. 访问特定位置的数据
在Python 中我们可以通过Key 的名字或者下标来访问JSON ⽂件中任意位置的数据。
⽐如,假设我们想知道我们的第⼆个超级英雄的秘密⾝份。即在下图中,需要访问特定位置的数据在下图中以紫⾊突出显⽰。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。