Python 解析库json及jsonpath pickle的实现


Posted in Python onAugust 17, 2020

1. 数据抽取的概念

Python 解析库json及jsonpath pickle的实现

2. 数据的分类

Python 解析库json及jsonpath pickle的实现

3. JSON数据概述及解析

3.1 JSON数据格式

Python 解析库json及jsonpath pickle的实现

3.2 解析库json

json模块是Python内置标准库,主要可以完成两个功能:序列化和反序列化。JSON对象和Python对象映射图如下:

Python 解析库json及jsonpath pickle的实现

3.2.1 json序列化

对象(字典/列表) 通过 json.dump()/json.dumps() ==> json字符串。示例代码如下:

import json
class Phone(object):
 def __init__(self, name, price):
  self.name = name
  self.price = price

class Default(json.JSONEncoder):
 def default(self, o):
  print(o) # o: <__main__.Phone object at 0x10aa52c90>
  return [o.name, o.price]

def parse(obj):
 print(obj)
 return {"name": obj.name, "price": obj.price}

person_info_dict = {
 "name": "Amo",
 "age": 18,
 "is_boy": True,
 # "n": float("nan"), # float("nan"):NaN float("inf")=>Infinity float("-inf")=>-Infinity
 "phone": Phone("苹果8plus", 6458),
 "hobby": ("sing", "dance"),
 "dog": {
  "name": "藏獒",
  "age": 5,
  "color": "棕色",
  "isVIP": True,
  "child": None
 },
}

"""
obj:需要序列化的对象 字典/列表 这里指的是person_info_dict
indent: 缩进 单位: 字符
sort_keys: 是否按key排序 默认是False不排序
cls: json.JSONEncoder子类 处理不能序列化的对象
ensure_ascii: 是否确保ascii编码 默认是True确保 "苹果8plus"==>"\u82f9\u679c8plus" 所以改为False
default: 对象不能被序列化时,调用对应的函数解析
"""

# 将结果返回给一个变量
result = json.dumps(person_info_dict,
     indent=2,
     sort_keys=True,
     ensure_ascii=False,
     # cls=Default,
     default=parse,
     # allow_nan=False 是否处理特殊常量值
     # 默认为True 但是JSON标准规范不支持NaN, Infinity和-Infinity
     )
print(result)
with open("dump.json", "w", encoding="utf8") as file:
 # json.dump是将序列化后的内容存储到文件中 其他参数用法和dumps一致
 json.dump(person_info_dict, file, indent=4, ensure_ascii=False, default=parse)

3.2.2 json反序列化

json字符串通过json.load()/json.loads()==> 对象(字典/列表),示例代码如下:

import json
class Phone(object):
 def __init__(self, name, price):
  self.name = name
  self.price = price

def pi(num):
 return int(num) + 1

def oh(dic):
 if "price" in dic.keys():
  return Phone(dic["name"], dic["price"])
 return dic

def oph(*args, **kwargs):
 print(*args, **kwargs)

# 我自己本地有一个dump.json文件
with open("dump.json", "r", encoding="utf8") as file:
 # content = file.read()
 # parse_int/float: 整数/浮点数钩子函数
 # object_hook: 对象解析钩子函数 将字典转为特定对象 传递给函数的是字典对象
 # object_pairs_hook: 转化为特定对象 传递的是元组列表
 # parse_constant: 常量钩子函数 NaN/Infinity/-Infinity
 # result = json.loads(content, object_hook=oh, parse_int=pi, object_pairs_hook=oph)
 result = json.load(file, parse_int=pi, object_hook=oh) # 直接将文件对象传入
 print(type(result)) # <class 'dict'>
 print(result)

4. jsonpath

jsonpath三方库,点击这里这里进入官网,通过路径表达式,来快速获取字典当中的指定数据,灵感来自xpath表达式。命令安装:

pip install --user -i http://pypi.douban.com/simple --trusted-host pypi.douban.com jsonpath

或者:

Python 解析库json及jsonpath pickle的实现

4.1 使用

语法格式如下:

from jsonpath import jsonpath
dic = {....} # 要找数据的字典
jsonpath(dic, 表达式)

常用的表达式语法如下:

JSONPath 描述
$ 根节点(假定的外部对象,可以理解为上方的dic)
@ 现行节点(当前对象)
.或者[] 取子节点(子对象)
.. 就是不管位置,选择所有符合条件的节点(后代对象)
* 匹配所有元素节点
[] 迭代集合,谓词条件,下标
[,] 多选
?() 支持过滤操作
() 支持表达式操作
[start: end : step] 切片

4.2 使用示例

案例一用到的字典如下:

dic = {
 "person": {
  "name": "Amo",
  "age": 18,
  "dog": [{
   "name": "小花",
   "color": "red",
   "age": 6,
   "isVIP": True
  },
   {
    "name": "小黑",
    "color": "black",
    "age": 2
   }]
 }
}

将上述抽象成一个树形结构如图所示:

Python 解析库json及jsonpath pickle的实现

需求及结果如下:

JSONPath Result
$.person.age 获取人的年龄
$..dog[1].age 获取第2个小狗的年龄
$..dog[0,1].age | $..dog[*].age 获取所有小狗的年龄
$..dog[?(@.isVIP)] 获取是VIP的小狗
$..dog[?(@.age>2)] 获取年龄大于2的小狗
$..dog[-1:] | $..dog[(@.length-1)] 获取最后一个小狗

代码如下:

from jsonpath import jsonpath

dic = {
 "person": {
  "name": "Amo",
  "age": 18,
  "dog": [{
   "name": "小花",
   "color": "red",
   "age": 6,
   "isVIP": True
  },
   {
    "name": "小黑",
    "color": "black",
    "age": 2
   }]
 }
}

# 1.获取人的年龄
print(jsonpath(dic, "$.person.age")) # 获取到数据返回一个列表 否则返回False
# 2.获取第2个小狗的年龄
print(jsonpath(dic, "$..dog[1].age"))
# 3.获取所有小狗的年龄
print(jsonpath(dic, "$..dog[0,1].age"))
print(jsonpath(dic, "$..dog[*].age"))
# 4.获取是VIP的小狗
print(jsonpath(dic, "$..dog[?(@.isVIP)]"))
# 5.获取年龄大于2的小狗
print(jsonpath(dic, "$..dog[?(@.age>2)]"))
# 6.获取最后一个小狗
print(jsonpath(dic, "$..dog[-1:]"))
print(jsonpath(dic, "$..dog[(@.length-1)]"))

上述代码执行结果如下:

Python 解析库json及jsonpath pickle的实现

案例二用到的字典如下:

book_dict = {
 "store": {
  "book": [
   {"category": "reference",
    "author": "Nigel Rees",
    "title": "Sayings of the Century",
    "price": 8.95
    },
   {"category": "fiction",
    "author": "Evelyn Waugh",
    "title": "Sword of Honour",
    "price": 12.99
    },
   {"category": "fiction",
    "author": "Herman Melville",
    "title": "Moby Dick",
    "isbn": "0-553-21311-3",
    "price": 8.99
    },
   {"category": "fiction",
    "author": "J. R. R. Tolkien",
    "title": "The Lord of the Rings",
    "isbn": "0-395-19395-8",
    "price": 22.99
    }
  ],
  "bicycle": {
   "color": "red",
   "price": 19.95
  }
 }
}

将上述抽象成一个树形结构如图所示:

Python 解析库json及jsonpath pickle的实现

需求及结果如下:

JSONPath Result
$.store.book[*].author store中的所有的book的作者
$.store[*] store下的所有的元素
$..price store中的所有的内容的价格
$..book[2] 第三本书
$..book[(@.length-1)] 最后一本书
$..book[0:2] 前两本书
$.store.book[?(@.isbn)] 获取有isbn的所有书
$.store.book[?(@.price>10)] 获取价格大于10的所有的书
$..* 获取所有的数据

代码如下:

from jsonpath import jsonpath

book_dict = {
 "store": {
  "book": [
   {"category": "reference",
    "author": "Nigel Rees",
    "title": "Sayings of the Century",
    "price": 8.95
    },
   {"category": "fiction",
    "author": "Evelyn Waugh",
    "title": "Sword of Honour",
    "price": 12.99
    },
   {"category": "fiction",
    "author": "Herman Melville",
    "title": "Moby Dick",
    "isbn": "0-553-21311-3",
    "price": 8.99
    },
   {"category": "fiction",
    "author": "J. R. R. Tolkien",
    "title": "The Lord of the Rings",
    "isbn": "0-395-19395-8",
    "price": 22.99
    }
  ],
  "bicycle": {
   "color": "red",
   "price": 19.95
  }
 }
}
# 1.store中的所有的book的作者
print(jsonpath(book_dict, "$.store.book[*].author"))
print(jsonpath(book_dict, "$..author"))
# 2.store下的所有的元素
print(jsonpath(book_dict, "$.store[*]"))
print(jsonpath(book_dict, "$.store.*"))
# 3.store中的所有的内容的价格
print(jsonpath(book_dict, "$..price"))
# 4.第三本书
print(jsonpath(book_dict, "$..book[2]"))
# 5.最后一本书
print(jsonpath(book_dict, "$..book[-1:]"))
print(jsonpath(book_dict, "$..book[(@.length-1)]"))
# 6.前两本书
print(jsonpath(book_dict, "$..book[0:2]"))
# 7.获取有isbn的所有书
print(jsonpath(book_dict, "$.store.book[?(@.isbn)]"))
# 8.获取价格大于10的所有的书
print(jsonpath(book_dict, "$.store.book[?(@.price>10)]"))
# 9.获取所有的数据
print(jsonpath(book_dict, "$..*"))

5. Python专用JSON解析库pickle

pickle处理的json对象不通用,可以额外的把函数给序列化。示例代码如下:

import pickle

def eat():
 print("Amo在努力地写博客~")

person_info_dict = {
 "name": "Amo",
 "age": 18,
 "eat": eat
}

# print(pickle.dumps(person_info_dict))
with open("pickle_json", "wb") as file:
 pickle.dump(person_info_dict, file)

with open("pickle_json", "rb") as file:
 result = pickle.load(file)
 result["eat"]()

JsonPath与XPath语法对比:

Json结构清晰,可读性高,复杂度低,非常容易匹配,下表中对应了XPath的用法。

XPath JSONPath 描述
/ $ 根节点
. @ 现行节点
/ .or[] 取子节点
.. n/a 取父节点,Jsonpath未支持
// .. 就是不管位置,选择所有符合条件的条件
* * 匹配所有元素节点
@ n/a 根据属性访问,Json不支持,因为Json是个Key-value递归结构,不需要。
[] [] 迭代器标示(可以在里边做简单的迭代操作,如数组下标,根据内容选值等)
| [,] 支持迭代器中做多选。
[] ?() 支持过滤操作.
n/a () 支持表达式计算
() n/a 分组,JsonPath不支持

到此这篇关于Python 解析库json及jsonpath pickle的实现的文章就介绍到这了,更多相关Python 解析库json及jsonpath pickle内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python输出各行命令详解
Feb 01 Python
Python之inspect模块实现获取加载模块路径的方法
Oct 16 Python
python for 循环获取index索引的方法
Feb 01 Python
python实现名片管理系统项目
Apr 26 Python
python中报错&quot;json.decoder.JSONDecodeError: Expecting value:&quot;的解决
Apr 29 Python
使用Flask-Cache缓存实现给Flask提速的方法详解
Jun 11 Python
使用Python脚本从文件读取数据代码实例
Jan 19 Python
基于梯度爆炸的解决方法:clip gradient
Feb 04 Python
解决Jupyter因卸载重装导致的问题修复
Apr 10 Python
Python sublime安装及配置过程详解
Jun 29 Python
Python用Jira库来操作Jira
Dec 28 Python
Python OpenCV超详细讲解调整大小与图像操作的实现
Apr 02 Python
Python实现爬取网页中动态加载的数据
Aug 17 #Python
Python 如何操作 SQLite 数据库
Aug 17 #Python
Python使用正则表达式实现爬虫数据抽取
Aug 17 #Python
Python 通过正则表达式快速获取电影的下载地址
Aug 17 #Python
Python 程序员必须掌握的日志记录
Aug 17 #Python
Python使用urlretrieve实现直接远程下载图片的示例代码
Aug 17 #Python
Python 如何查找特定类型文件
Aug 17 #Python
You might like
phpmyadmin中配置文件现在需要绝密的短语密码的解决方法
2007/02/11 PHP
php 文章采集正则代码
2009/12/28 PHP
php中curl、fsocket、file_get_content三个函数的使用比较
2014/05/09 PHP
简单了解WordPress开发中update_option()函数的用法
2016/01/11 PHP
老司机传授Ubuntu下Apache+PHP+MySQL环境搭建攻略
2016/03/20 PHP
smarty循环嵌套用法示例分析
2016/07/19 PHP
PHP实现在数据库百万条数据中随机获取20条记录的方法
2017/04/19 PHP
php读取本地json文件的实例
2018/03/07 PHP
PHP设计模式(七)组合模式Composite实例详解【结构型】
2020/05/02 PHP
JavaScript 动态创建VML的方法
2009/10/14 Javascript
自己写的兼容ie和ff的在线文本编辑器类似ewebeditor
2012/12/12 Javascript
html、css和jquery相结合实现简单的进度条效果实例代码
2016/10/24 Javascript
Vue.js第二天学习笔记(vue-router)
2016/12/01 Javascript
MUI 解决动态列表页图片懒加载再次加载不成功的bug问题
2017/04/13 Javascript
gulp解决跨域的配置文件问题
2017/06/08 Javascript
bootstrap timepicker在angular中取值并转化为时间戳
2017/06/13 Javascript
jQuery 1.9版本以上的浏览器判断方法代码分享
2017/08/28 jQuery
javascript 作用于作用域链的详解
2017/09/27 Javascript
vue项目首屏加载时间优化实战
2019/04/23 Javascript
使用Angular material主题定义自己的组件库的配色体系
2019/09/04 Javascript
JavaScript 俄罗斯方块游戏实现方法与代码解释
2020/04/08 Javascript
[35:44]2014 DOTA2华西杯精英邀请赛 5 24 iG VS VG
2014/05/26 DOTA
[13:25]VP vs VICI (BO3)
2018/06/07 DOTA
Python的Django框架中消息通知的计数器实现教程
2016/06/13 Python
python登录并爬取淘宝信息代码示例
2017/12/09 Python
Python importlib动态导入模块实现代码
2020/04/16 Python
Python selenium爬取微博数据代码实例
2020/05/22 Python
Python Scrapy图片爬取原理及代码实例
2020/06/12 Python
购买大码女装:Lane Bryant
2016/09/07 全球购物
巴西宠物商店:Cobasi
2019/04/19 全球购物
彪马土耳其官网:PUMA土耳其
2019/07/14 全球购物
工业自动化专业毕业生推荐信
2013/11/18 职场文书
交通安全演讲稿
2014/01/07 职场文书
普通党员对照检查材料
2014/09/24 职场文书
毕业生爱心捐书倡议书
2015/04/27 职场文书
Windows10安装Apache2.4的方法步骤
2022/06/25 Servers