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 相关文章推荐
Mac OS X10.9安装的Python2.7升级Python3.3步骤详解
Dec 04 Python
打包发布Python模块的方法详解
Sep 18 Python
python ansible服务及剧本编写
Dec 29 Python
Python3 XML 获取雅虎天气的实现方法
Feb 01 Python
将string类型的数据类型转换为spark rdd时报错的解决方法
Feb 18 Python
python图形工具turtle绘制国际象棋棋盘
May 23 Python
python实现网站微信登录的示例代码
Sep 18 Python
pip 安装库比较慢的解决方法(国内镜像)
Oct 06 Python
python3 字符串知识点学习笔记
Feb 08 Python
python实现一次性封装多条sql语句(begin end)
Jun 06 Python
Python自动发送和收取邮件的方法
Aug 12 Python
python playwright之元素定位示例详解
Jul 23 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同时支持GIF、png、JPEG
2006/10/09 PHP
php 文本文件的读取效率
2012/02/10 PHP
php通过ajax实现双击table修改内容
2014/04/28 PHP
php设置静态内容缓存时间的方法
2014/12/01 PHP
理解php依赖注入和控制反转
2016/05/11 PHP
php查询及多条件查询
2017/02/26 PHP
PHP token验证生成原理实例分析
2019/06/05 PHP
php 使用 __call实现重载功能示例
2019/11/18 PHP
js 表单验证方法(实用)
2009/04/28 Javascript
jQuery学习4 浏览器的事件模型
2010/02/07 Javascript
jquery 元素相对定位代码
2010/10/15 Javascript
非html5实现js版弹球游戏示例代码
2013/09/22 Javascript
jQuery中[attribute=value]选择器用法实例
2014/12/31 Javascript
浅谈JavaScript变量的自动转换和语句
2016/06/12 Javascript
jQuery插件学习教程之SlidesJs轮播+Validation验证
2016/07/12 Javascript
Vue实现导出excel表格功能
2018/03/30 Javascript
使用Vue自定义指令实现Select组件
2018/05/24 Javascript
React中this丢失的四种解决方法
2019/03/12 Javascript
JavaScript实现省份城市的三级联动
2020/02/11 Javascript
Python使用tablib生成excel文件的简单实现方法
2016/03/16 Python
Python 判断 有向图 是否有环的实例讲解
2018/02/01 Python
Django中Model的使用方法教程
2018/03/07 Python
python 定义给定初值或长度的list方法
2018/06/23 Python
python实现俄罗斯方块
2018/06/26 Python
Python爬虫小技巧之伪造随机的User-Agent
2018/09/13 Python
python提取具有某种特定字符串的行数据方法
2018/12/11 Python
python dict 相同key 合并value的实例
2019/01/21 Python
浅谈Python中的异常和JSON读写数据的实现
2020/02/27 Python
Prometheus开发中间件Exporter过程详解
2020/11/30 Python
plt.figure()参数使用详解及运行演示
2021/01/08 Python
欧洲高端品牌直销店:Fashionesta
2016/08/31 全球购物
英国在线照明超市:Castlegate Lights
2019/10/30 全球购物
缴纳养老保险的证明
2014/01/10 职场文书
关于保护环境的标语
2014/06/09 职场文书
python基础之while循环语句的使用
2021/04/20 Python
pytorch查看网络参数显存占用量等操作
2021/05/12 Python