Python3自定义json逐层解析器代码


Posted in Python onMay 11, 2020

用python3对json内容逐层进行解析,拿中国天气网的接口返回数据测试,

代码如下:

# -*- coding: utf-8 -*-
import operator as op
from collections import defaultdict

class Json(object):

  def __init__(self, json: str):
    sth = eval(json)
    load = lambda sth: sth if op.eq(type(sth).__name__, dict.__name__) else None
    self.json_dict = load(sth)
    self.ret_j = defaultdict(dict)
    self.analyze(self.json_dict)

  def analyze(self, j_dict: dict, lvl=0) -> None:
    lvl += 1
    for k in j_dict:
      v = j_dict[k]
      v_type = type(v)
      try:
        self.ret_j[lvl][str(j_dict)].append(f"{k}:{v}")
      except:
        self.ret_j[lvl][str(j_dict)] = []
        self.ret_j[lvl][str(j_dict)].append(f"{k}:{v}")
      if op.eq(v_type.__name__, dict.__name__):
        self.analyze(v, lvl)
      elif op.eq(v_type.__name__, list.__name__):
        for each in v:
          if op.eq(type(each).__name__, dict.__name__):
            self.analyze(each, lvl)

  def get_analysis(self) -> None:
    print(f"这个json拢共分{len(self.ret_j)}层")
    print("------")
    for lvl in self.ret_j:
      print(f"第{lvl}层解析")
      for root in self.ret_j[lvl]:
        print(f"解析内容:{root}")
        for each in self.ret_j[lvl][root]:
          print(each)
      print("------")

if __name__ == '__main__':
  try:
    import requests
  except:
    exit(0)
  url = "http://forecast.weather.com.cn/napi/h5map/city/101/jQuery1533133004035?callback=jQuery1533133004035"
  r = requests.get(url)
  d_r = r.content.decode()
  json_4_test = d_r[d_r.index("(") + 1:d_r.index(")")]
  Json(json_4_test).get_analysis()

其中json_4_test是待解析的json字符串。

设计思路:

Python3自定义json逐层解析器代码

补充知识:python之logging模块:将不同的日志写入到不同的文件

如下所示:

import logging.config
from logging import LogRecord

# 通常用于Linux系统下,使控制台输出的日志带颜色
class ColorFormatter(logging.Formatter):
  log_colors = {
    'CRITICAL': '\033[0;31m',
    'ERROR': '\033[0;33m',
    'WARNING': '\033[0;35m',
    'INFO': '\033[0;32m',
    'DEBUG': '\033[0;00m',
  }

  def format(self, record: LogRecord) -> str:
    s = super().format(record)

    level_name = record.levelname
    if level_name in self.log_colors:
      return self.log_colors[level_name] + s + '\033[0m'
    return s

class MyFilter400(logging.Filter):
  def filter(self, record: LogRecord):
    if record.msg.startswith("4"):
      return True
    return False

class MyFilter300(logging.Filter):
  def filter(self, record: LogRecord):
    if record.msg.startswith("3"):
      return True
    return False

LOG_LEVEL = logging.INFO

LOGGER = {
  'version': 1,
  'disable_existing_loggers': True,
  'formatters': {
    'color': {
      'class': '__main__.ColorFormatter', # 如果你的模块不是写在启动程序中,请将__main__更换成你模块的路径,下同
      'format': '%(asctime)s [%(name)s] %(levelname)s: %(message)s'
    },
    'default': {
      'class': 'logging.Formatter',
      'format': '%(message)s'
    }
  },
  'filters': {
    'filter_400': {
      '()': '__main__.MyFilter400'
    },
    'filter_300': {
      '()': '__main__.MyFilter300'
    }
  },
  'handlers': {
    'console': {
      'level': LOG_LEVEL,
      'class': 'logging.StreamHandler',
      'formatter': 'color',
    },
    'file1': {
      'level': LOG_LEVEL,
      'class': 'logging.FileHandler',
      'mode': 'w',
      'formatter': 'default',
      'filename': '400_log.txt',
      'encoding': 'utf-8',
      'filters': ['filter_400']
    },
    'file2': {
      'level': LOG_LEVEL,
      'class': 'logging.FileHandler',
      'mode': 'w',
      'formatter': 'default',
      'filename': '300_log.txt',
      'encoding': 'utf-8',
      'filters': ['filter_300']
    },
  },
  'loggers': {
    '__main__': {
      'handlers': ['file1', 'file2', 'console'],
      'level': LOG_LEVEL,
    },
  }
}

logging.config.dictConfig(LOGGER)

logger = logging.getLogger(__name__)

logger.debug('200,this is a logger debug message')
logger.info('302,this is a logger info message')
logger.warning('301,this is a logger warning message')
logger.error('404,this is a logger error message')
logger.critical('500,this is a logger critical message')

print("%s" % __name__)

运行效果图:

控制台:

Python3自定义json逐层解析器代码

文件:

3开头的写入到300_log.txt

4开头的写入到400_log.txt

特别注意,使用过滤器的一个问题

class MyFilter400And500(logging.Filter):
  def filter(self, record: LogRecord):
    if record.msg.startswith("4") or record.msg.startswith("5"):
      return True
    return False

# record.msg = "404, %s, %s" 
logger.info(f"{status_code}, %s, %s", website, link)

# record.msg = "%s, %s, %s",这就导致过滤器返回False
logger.info("%s, %s, %s", status_code, website, link)

因此,如果发现消息没有写入文件,可能是消息格式的问题。

目前,官方推荐字符串格式化的方式就是第一种方式,%s和.format()的方式都不如这个好。

以上这篇Python3自定义json逐层解析器代码就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
使用PYTHON创建XML文档
Mar 01 Python
使用Python开发windows GUI程序入门实例
Oct 23 Python
python计算牛顿迭代多项式实例分析
May 07 Python
opencv改变imshow窗口大小,窗口位置的方法
Apr 02 Python
cmd运行python文件时对结果进行保存的方法
May 16 Python
python+numpy按行求一个二维数组的最大值方法
Jul 09 Python
Python实现的企业粉丝抽奖功能示例
Jul 26 Python
Python类继承和多态原理解析
Feb 05 Python
在主流系统之上安装Pygame的方法
May 20 Python
python 牛顿法实现逻辑回归(Logistic Regression)
Oct 15 Python
tensorflow2.0教程之Keras快速入门
Feb 20 Python
python实现过滤敏感词
May 08 Python
Python3自定义http/https请求拦截mitmproxy脚本实例
May 11 #Python
Python 找出出现次数超过数组长度一半的元素实例
May 11 #Python
Pycharm如何导入python文件及解决报错问题
May 10 #Python
python3.6环境下安装freetype库和基本使用方法(推荐)
May 10 #Python
Pycharm中安装wordcloud等库失败问题及终端通过pip安装的Python库如何添加到Pycharm解释器中(推荐)
May 10 #Python
python对接ihuyi实现短信验证码发送
May 10 #Python
python调用API接口实现登陆短信验证
May 10 #Python
You might like
php实现获取局域网所有用户的电脑IP和主机名、及mac地址完整实例
2014/07/18 PHP
php使用pear_smtp发送邮件
2016/04/15 PHP
PHP addslashes()函数讲解
2019/02/03 PHP
基于jquery tab切换(防止页面刷新)
2012/05/23 Javascript
分享精心挑选的12款优秀jQuery Ajax分页插件和教程
2012/08/09 Javascript
Bootstrap树形控件使用方法详解
2016/01/27 Javascript
AngularJS基础 ng-dblclick 指令用法
2016/08/01 Javascript
浅谈layer的iframe弹窗给里面的标签赋值的问题
2016/11/10 Javascript
JS实现仿百度文库评分功能
2017/01/12 Javascript
node.js入门教程之querystring模块的使用方法
2017/02/27 Javascript
Vue学习笔记进阶篇之函数化组件解析
2017/07/21 Javascript
浅谈gulp创建完整的项目流程
2017/12/20 Javascript
webpack+vue2构建vue项目骨架的方法
2018/01/09 Javascript
微信小程序实现的涂鸦功能示例【附源码下载】
2018/01/12 Javascript
Array数组对象中的forEach、map、filter及reduce详析
2018/08/02 Javascript
webpack多入口多出口的实现方法
2018/08/17 Javascript
vue-cli 3.x 修改dist路径的方法
2018/09/19 Javascript
详解vue使用$http服务端收不到参数
2019/04/19 Javascript
vue中使用element组件时事件想要传递其他参数的问题
2019/09/18 Javascript
[00:59]DOTA2荣耀之路1:Doom is back!weapon X!
2018/05/22 DOTA
跟老齐学Python之有点简约的元组
2014/09/24 Python
为Python的web框架编写MVC配置来使其运行的教程
2015/04/30 Python
Python爬虫实例扒取2345天气预报
2018/03/04 Python
PyQt5 窗口切换与自定义对话框的实例
2019/06/20 Python
Python使用Slider组件实现调整曲线参数功能示例
2019/09/06 Python
jupyter notebook的安装与使用详解
2020/05/18 Python
同程旅游英文网站:LY.com
2018/11/13 全球购物
爸爸的花儿落了教学反思
2014/02/20 职场文书
材料专业毕业生求职信
2014/02/26 职场文书
植树节口号
2014/06/21 职场文书
书法兴趣小组活动总结
2014/07/07 职场文书
革命英雄事迹演讲稿
2014/09/13 职场文书
2015年办公室工作总结范文
2015/03/31 职场文书
2015年度物业公司工作总结
2015/04/27 职场文书
JavaScript分页组件使用方法详解
2021/07/26 Javascript
python微信智能AI机器人实现多种支付方式
2022/04/12 Python