对于 json 格式的数据,如何进行有效字段的提取

本贴最后更新于 1602 天前,其中的信息可能已经时移世异

在Python12期看到mongo女神在讲如何去提取json数据里面的有效字段,讲了2种方式,小白大神都通用,发来给大家观摩一下!

有一段数据存在load.txt里面,数据内容如下所示:

{
    "status": 1,
    "code": "10001",
    "data": [
        {
            "id": "99274",
            "createTime": "2018-12-19 16:52:22.0",
            "payMemberId": "42332",
            "incomeMemberId": "42332",
            "amount": "999900.00",
            "incomeMemberMoney": "-998839.67",
            "payMemberMoney": "-998839.67",
            "status": "1"
        },
        {
            "id": "99264",
            "createTime": "2018-12-19 16:50:52.0",
            "payMemberId": "42332",
            "incomeMemberId": "42332",
            "amount": "100.00",
            "incomeMemberMoney": "1060.33",
            "payMemberMoney": "1060.33",
            "status": "1"
        },
        {
            "id": "99190",
            "createTime": "2018-12-19 16:04:51.0",
            "payMemberId": "42332",
            "incomeMemberId": "0",
            "amount": "30.00",
            "incomeMemberMoney": null,
            "payMemberMoney": "160.33",
            "status": "0"
        }
    ],
    "msg": "获取用户流水记录成功!"
}

题目要求:提取数据内容里面的status=1的值,并统计次数。

方法一:最简单的字符串处理方法

with open('load.txt', 'r', encoding='utf-8') as fp:  # 打开文件
    financelog = json.load(fp)  # 文件对象序列化成字典
    datas = financelog['data']  # 获取data列表
    flag = 0
    for data in datas: # 遍历列表
        if data['status'] == '1':  # 判断是否等于1
            flag += 1  # 统计status=1
    print("status=1 的条数为:", flag)

那么这个方法的步骤是:先读取内容--再去序列化--再根据data这个 key获取相关内容--再去遍历列表--统计
看起来,是非常完美的一个解决方案,但是:学习就是为了寻找更优解!所以我们有了第二种方法:

方法二:利用正则处理

import re
# 使用正则解析 匹配并查找
financelog = open('loads.txt', 'r', encoding='utf-8').read()  # 读取文件里面的内容并返回一个字符串
status = re.findall('"status": "1"', financelog)  # 匹配在目标字符串中查找"status": "1"的内容,放到一个列表里面
print("status=1 的条数为:", len(status))  # 获取列表的长度就代表有多少条"status": "1"的数据

对于同一个题目,有2种解决方案,或许不止!
这就是学习的意义!

  • Python
    105 引用 • 237 回帖 • 1 关注
1 操作
huahua 在 2020-08-07 21:51:45 更新了该帖
回帖
请输入回帖内容 ...