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实现的jpg格式图片修复代码
Apr 21 Python
如何准确判断请求是搜索引擎爬虫(蜘蛛)发出的请求
Oct 13 Python
浅谈Python的异常处理
Jun 19 Python
基于pandas数据样本行列选取的方法
Apr 20 Python
Python matplotlib学习笔记之坐标轴范围
Jun 28 Python
Python 分享10个PyCharm技巧
Jul 13 Python
Python Web版语音合成实例详解
Jul 16 Python
Python实现代码统计工具
Sep 19 Python
使用pyplot.matshow()函数添加绘图标题
Jun 16 Python
matplotlib相关系统目录获取方式小结
Feb 03 Python
分析Python list操作为什么会错误
Nov 17 Python
基于PyQT5制作一个桌面摸鱼工具
Feb 15 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
php实现jQuery扩展函数
2009/10/30 PHP
php获取bing每日壁纸示例分享
2014/02/25 PHP
php把session写入数据库示例
2014/02/26 PHP
php实例分享之二维数组排序
2014/05/15 PHP
PHP实现搜索相似图片
2015/09/22 PHP
PHP微信发送推送消息乱码的解决方法
2019/02/28 PHP
修改file按钮的默认样式实现代码
2013/04/23 Javascript
JSF中confirm弹出框的用法示例介绍
2014/01/07 Javascript
javascript实现仿IE顶部的可关闭警告条
2015/05/05 Javascript
原生JavaScript实现Ajax的方法
2016/04/07 Javascript
微信小程序中使用javascript 回调函数
2017/05/11 Javascript
详解基于Bootstrap+angular的一个豆瓣电影app
2017/06/26 Javascript
jQuery选择器之属性筛选选择器用法详解
2017/09/19 jQuery
VS Code转换大小写、修改选中文字或代码颜色的方法
2017/12/15 Javascript
为什么使用koa2搭建微信第三方公众平台的原因
2018/05/16 Javascript
Python实现Const详解
2015/01/27 Python
Python字符串和文件操作常用函数分析
2015/04/08 Python
Python找出9个连续的空闲端口
2016/02/01 Python
python实现装饰器、描述符
2018/02/28 Python
python dataframe向下向上填充,fillna和ffill的方法
2018/11/28 Python
Python实现插入排序和选择排序的方法
2019/05/12 Python
python算法与数据结构之冒泡排序实例详解
2019/06/22 Python
python框架Django实战商城项目之工程搭建过程图文详解
2020/03/09 Python
美国室内盆栽植物购买网站:Plants.com
2020/04/24 全球购物
线程同步的方法
2016/11/23 面试题
迟到早退检讨书
2014/02/10 职场文书
毕业生求职自荐书范文
2014/03/27 职场文书
出生证明公证书
2014/04/09 职场文书
法制宣传月活动总结
2014/04/29 职场文书
反邪教宣传工作方案
2014/05/07 职场文书
消防标语大全
2014/06/07 职场文书
争先创优演讲稿
2014/09/15 职场文书
2014国庆节幼儿园亲子活动方案
2014/09/16 职场文书
简单租房协议书(范本)
2014/10/13 职场文书
骨干教师申报材料
2014/12/17 职场文书
哪类餐饮行业,最适合在高校创业?
2019/08/19 职场文书