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字典形式.

就这么简单,代码如下:

import 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文件,

代码如下:

import pandas as pd
df = pd.read_json('superheroes.json')

运行结果如下:

需要注意的是使用Pandas库不仅仅可以读取电脑本地磁盘上的JSON文件,也可以通过URL读取网络上存放的文件.

代码如下:

df1 = pd.read_json('https://mdn.github.io/learning-area/javascript/oojs/json/superheroes.json')

3.3. 使用Pandas读取嵌套JSON类型

我们有时候遇到的JSON文件是嵌套的,这经常会让读取工作变得有些困难. 其实嵌套JSON和Python中的嵌套字典思想类似,即字典中嵌套字典.

我们观察上述例子中的member字段,其值也为字典类型,下图中我们使用缩进来展示嵌套结构。

设想一下,当我们将JSON文件加载到Pandas数据框架中时,members列如下所示。每行包含一个字典。


接下来我们讨论两种实现方法,这两种方法中,我们可以解析数据,以便将每个键分解为单独的一列。

方案一

我们可以在members这一列上使用apply方法,代码如下:

df['members'].apply(pd.Series)

上述代码执行后,members列会被拆分为4个新列,如下所示:

当然如果你想将上述拆分后的结果和之前的结果进行合并,可以使用pd.concat函数,

代码如下:

df = pd.concat([df['members'].apply(pd.Series), df.drop('members', axis = 1)], axis = 1)

方案二

在Pandas库中还有一个函数 json_normalize() ,它允许我们把嵌套的JSON展开。这是最简单的方法来解析嵌套的JSON了。

代码如下:

def 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中的名字添加统一的前缀。

代码如下:

pd.json_normalize(superHeroSquad,
	record_path = ['members'],
	meta = ['squadName', 'homeTown', 'formed', 'secretBase', 'active'],
	meta_prefix = 'members_')

运行结果如下:

3.4. 访问特定位置的数据

在Python中我们可以通过Key的名字或者下标来访问JSON文件中任意位置的数据。

比如,假设我们想知道我们的第二个超级英雄的秘密身份。即在下图中,需要访问特定位置的数据在下图中以紫色突出显示。

为了得到这个值,我们可以直接使用以下语句:

superHeroSquad['members'][1]['secretIdentity']

从层次结构的顶部开始,由上往下,我们需要的第一个key是'members',因为它是我们需要访问的值所在的父节点。

在‘members'对应的键值中,我们看中括号,然后下标1表示list中的第二个成员。接着我们来看字段'secretIdentity',如下所示:

将上述过程合并在一起,我们就可以得到我们特定位置出的值为'Jane Wilson'。

细心的同学可能已经注意到,我在上面的JSON片段中突出显示了两个蓝色的值。希望感兴趣的同学们可以作为练习来尝试访问这些值。欢迎在文章后面的评论区中分享你的代码。

3.5. 导出JSON

让我们编辑一下我们最后一位超级英雄,将其secretIdentity从‘Unknow'更改为‘Will Smith',接着将这个字典导出为JSON文件。这里我们将使用json.dump()函数将字典写入文件。

代码如下:

#update secret identity of Eternal Flame
superHeroSquad['members'][2]['secretIdentity'] = 'Will Smith'
with open('superheroes.json', 'w') as file:
    json.dump(superHeroSquad, file)

上述代码运行后,我们打开文件superheroes.json,可以发现最后一名超级英雄的secretIdentity已经由Unknow变为了Will Smith.

当然,作为选择,我们也可以使用Pandas中的to_json()函数,完成上述功能。

df.to_json('superheroes.json')

3.6. 格式化输出

我们有时候在终端直接打印json文件,通常会得到很不美观的输出,样例如下:

为了让其看起来更加美观,我们这里可以在函数json.dump中采用参数indent参数来控制输出格式,代码如下:

with open('superheroes.json', 'w') as file:
    json.dump(superHeroSquad, file, indent = 4)

结果输出如下,是不是看上去更加美观啦。。。

3.7. 输出字段排序

当然dump函数中含有字段sort_key,通过设置其值,可以控制输出时是否对key进行排序。需要注意所有的key包括嵌套的key都会进行排序。

样例如下:

with open('superheroes.json', 'w') as file:
    json.dump(superHeroSquad, file, indent = 4, sort_keys = True)

运行结果如下:

4.总结

最后,让我们对本文做一下回顾,总结如下:

  • JSON文件通常由key:结对组成,这里key通常为字符串格式,value一般为字符串,数字,布尔,数组,对象或者null
  • Python有内置函数可以方便的读取JSON文件转化为Python中的字典类型或者Pandas可以处理的类型
  • 使用pd.read_json()来读取简单的JSON,使用pd.json_normalize()来读取嵌套的JSON
  • 我们可以通过key的名字或者下标来方便的获取JSON文件中特定位置的值
  • Python对象可以转化为JSON文件,同时可以对输出进行格式化输出以增加可读性

5.参考

链接一

到此这篇关于Python中优雅处理JSON文件的文章就介绍到这了,更多相关Python优雅处理JSON文件内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python处理json字符串转化为字典的简单实现

    今天一个朋友给个需求: 来来 {'isOK': 1, 'isRunning': None, 'isError': None} 怎么转换成字典 好,一看就是json转化很简单,开始: import json a = "{'isOK': 1, 'isRunning': None, 'isError': None}" print json.loads(a) 死活出不来结果,还报错,查了两个小时的百度,没搞明白. 最后,直接复制网上的代码,OK,运行成功,可是把我的a变量填进去,不行,报错:开

  • Python读写Json涉及到中文的处理方法

    今天在帮前端准备数据的时候,需要把数据格式转成json格式,说实话,涉及到中文有时候真的是很蛋疼,除非对Python的编码规则比较了解,不然处理起来真的很蛋疼. 整个逻辑 我们需要处理的是把一些文章处理,生成多个html文件,然后用json来显示文章的列表,图片,摘要和标题. 思路 为了以后的数据扩展,那必须有一个数据库,我的想法就是自己写一个简单的网页做为提交输入,然后post到后台以后录入到数据库中,再写一个展示文章的页面,展示效果正确后,写一个requests动态的把所有的数据都爬下来生成

  • Python遍历文件夹 处理json文件的方法

    有两种做法:os.walk().pathlib库,个人感觉pathlib库的path.glob用来匹配文件比较简单. 下面是第二种做法的实例(第一种做法百度有很多文章): from pathlib import Path import json analysis_root_dir = "D:\\analysis_data\json_file" store_result="D:\\analysis_data\\analysis_result\\dependency.csv&qu

  • Python3 处理JSON的实例详解

    Python3 处理JSON的实例详解 真的好简单,灰常简单 import os, io, sys, re, time, base64, json import webbrowser, urllib.request def main(): "main function" url = "http://m.weather.com.cn/data/101010100.html" stdout=urllib.request.urlopen(url) weatherInfo=

  • python处理json数据中的中文

    python中自带了处理python的模块,使用时候直接import json即可. 使用loads方法即可将json字符串转换成python对象,对应关系如下: JSON     Python object   dict array    list string   unicode number   (int) int, long number   (real) float true     True false    False null     None 但在使用json模块的时候需要注意

  • 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文件,当然我们

  • Python中优雅使用assert断言的方法实例

    目录 什么是 assert 断言 断言和异常的使用场景 使用断言的几个原则 建议不使用断言的情况: 总结 什么是 assert 断言 Assert statements are a convenient way to insert debugging assertions into a program 断言声明是用于程序调试的一个便捷方式.断言可以看做是一个 debug 工具,Python 的实现也符合这个设计哲学,在 Python 中 assert 语句的执行是依赖于__debug__这个内置

  • 一文搞懂Python读取text,CSV,JSON文件的方法

    目录 前言 打开文件 Python 中的文件读取模式 读取文本文件 读取 CSV 文件 读取 JSON 文件 总结 前言 文件是无处不在的,无论我们使用哪种编程语言,处理文件对于每个程序员都是必不可少的 文件处理是一种用于创建文件.写入数据和从中读取数据的过程,Python 拥有丰富的用于处理不同文件类型的包,从而使得我们可以更加轻松方便的完成文件处理的工作 本文大纲: 使用上下文管理器打开文件 Python 中的文件读取模式 读取 text 文件 读取 CSV 文件 读取 JSON 文件 打开

  • 在vue中读取本地Json文件的方法

    其实关于这个问题,网上已经可以找到些方法,不过基本上没有完整的,或者是其中有些坑,下面写一下自己的亲身实践. 使用vue读取本地json文件需要安装vue-resource插件,然后使用它的$http.get来读取json文件. json文件应该是必须放在static目录下 然后使用npm install 命令安装vue-resource,太慢的话就使用淘宝镜像安装,安装完成后先引用这个组件. 在main.js文件中添加: import VueResource from 'vue-resourc

  • 在vue项目中优雅的使用SVG的方法实例详解

    1.基础介绍 本文旨在介绍如何在项目中配置和方便的使用svg图标. 本文以vue项目为例,当然在react中的使用原理基本相似. svg图标可以直接通过img标签来使用,也可当做icon来使用. 本文是参考了鑫旭大佬的文章:SVG Sprite技术介绍. 2.配置 安装svg-sprite-loader.通过vue-cli脚手架创建的项目默认情况下会使用 url-loader 对svg进行处理,所以需要处理下: { test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, l

  • 在python中创建表格的两种方法实例

    目录 日常拉呱: 创建表格一般有两种方法: 一:通过导入xlwt创建 二:通过导入csv库来创建 1.写入数据 2.读取数据 总结 日常拉呱: 最近在学习爬虫模拟登陆各个软件,老师留有作业,模拟登录京东并爬取系列物品,可惜我还是个小白菜鸟,还是处于迷迷糊糊的状态,只能先了解一下边缘知识.爬取完数据,你是否在纠结这些数据放在哪呢?建一个表格或许会帮助到你! 创建表格一般有两种方法: 一:通过导入xlwt来创建,这种方法我比较喜欢,因为它够直观够容易理解,但是相对而言比较麻烦. 二:通过导入csv库

  • python中pygame针对游戏窗口的显示方法实例分析(附源码)

    本文实例讲述了python中pygame针对游戏窗口的显示方法.分享给大家供大家参考,具体如下: 在这篇教程中,我将给出一个demo演示: 当我们按下键盘的'f'键的时候,演示的窗口会切换到全屏显示和默认显示两种显示模式 并且在后台我们可以看到相关的信息输出: 上面给出了一个简单的例子,当然在pygame的官方文档中有对显示策略的更权威的说明: http://www.pygame.org/docs/ref/display.html#pygame.display.set_mode ''' pyga

  • SpringBoot读取资源目录中JSON文件的方法实例

    目录 前言 思路 示例 1.Maven依赖 2.json资源文件 3.读取json的Service 4.测试接口 最后 前言 最近在做一个公共相关的内容,公告里边的内容,打算做成配置化的. 但是考虑到存储到数据库,需要建立数据库表: 存储到配置组件中,担心配置组件存储不下: 于是决定先暂时存储到项目中的资源目录中,以JSON的格式存储,待观察公告这一模块的需求变更如何,再另行做打算. 本文分享SpringBoot读取资源目录JSON配置文件的相关方法. 思路 使用Spring的ResourceU

  • python中精确输出JSON浮点数的方法

    有时需要在JSON中使用浮点数,比如价格.坐标等信息.但python中的浮点数相当不准确, 例如下面的代码: 复制代码 代码如下: #!/usr/bin/env python import json as json data = [ 0.333, 0.999, 0.1 ]print json.dumps(data) 输出结果如下: 复制代码 代码如下: $ python floatjson.py[0.33300000000000002, 0.999, 0.10000000000000001] 能

  • Python中字典和JSON互转操作实例

    JSON是一种轻量级的数据交换格式,各种语言都有良好的支持.字典是Python的一种数据结构.可以看成关联数组. 有些时候我们需要设计到字典转换成JSON序列化到文件,或者从文件中读取JSON.简单备忘一下. Dict转JSON写入文件 复制代码 代码如下: #!/usr/bin/env python # coding=utf-8 import json d = {'first': 'One', 'second':2} json.dump(d, open('/tmp/result.txt', '

随机推荐