Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 463|回复: 0

Python解决数据筛选问题

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-5-24 10:44:37 | 显示全部楼层 |阅读模式

    最近工作中有个数据传输接口需要测试,

    业务需求:

    通过核对接口接收的数据条目数、是否等于接口传输条目数,印证数据接口的正确性。

    前提条件:

    本接口是实时传输。

    接口每次传输的数据是全量数据。

    解决方法:

    因为是全量传输,所以需要根据传输时间对接收数据进行筛选,

    把接口当次传输的数据找出来,并进行数据条目求和计算。

    看接收数是否和传输数一致。

     

    笔者尝试用非正则、正则表达式两种方法分别解决此问题。

     

    首先,需要对接收的数据进行格式处理:

    1、  获取传输数据

    通过开发给的接口URL,在网页上得到接口传输的数据信息。复制粘贴该页面所有数据到后缀为txt的文本文档中。

    如图显示:

     

     

    得到的接口传输的数据,并没有根据某个字段信息进行排序,所以数据显示没有什么规律性。

     

    2、  分析数据格式

    数据样式如下:

    原数据较长且比较复杂,不利于阅读和梳理思路,所以笔者精简了数据,只留下两条,并用红色框拆解出来数据的格式。

     

     

    可以看出来,数据是按照json串的格式进行传输的。美化后,显示如下。看着就更清晰了。

     

     

     

    3、  拆解数据,把源数据变成python中的字典数据类型

     

    将json串转换成dict类型,需要引入一个json包

    使用包中的json.loads的方法,将数据转化成dict类型。代码如下:

     

    import json

     

    with open("e:\\test\\sourcedata.txt",encoding="utf-8") as fp:

        content = fp.read()

        print(type(content))   #查看读取json串后的数据类型

    data_dict = json.loads(content)

    print(type(data_dict))      #查看处理json串后的数据类型

     

    执行结果如下:

     

     

     

    然后把得到的data_dict存放到新的文档loadsdata.txt中,代码如下:

    with open("e:\\test\\loadsdata.txt",'w',encoding="utf-8") as fp2:

            fp2.write(str(data_dict))

    print(type(data_dict))      #查看存放在新文档后的数据类型

     

    执行结果如下:

     

     

     

    4、  获取所需的时间信息

     

     

    时间信息是shelf_version字段,而该字段存在于data_dict字典中"data"这个key对应的value值里。

    这个value值是一个列表,列表里嵌套了多个字典。所以要再次对数据进行处理,取出value值。

     

    代码如下:

    data = data_dict['data']

     

    结果取出value列表(列表内容嵌套多个字典)。存放在新的文件newdata中,显示如下:

     

     

     

    数据格式整理好之后,终于可以开始数据筛选工作了。

     

    一、非正则方法

     

    1、  日期比对

    笔者只想查找2019-03-21这一天的10点-12点的时间段内,总共传输过来多少条数据。

    定义一个函数,用来筛选符合条件的日期。

     

    代码如下:

    def get_data(x):

        if x['shelf_version'] >'2019-03-21 10:00' and x['shelf_version'] <'2019-03-21 12:00' :

             return x

     

    使用filter函数,对newdata中的数据进行筛选,并把结果存放在新的list里,然后记录在result结果文件中,代码如下:

     

    result=list(filter(get_data,newdata))

    print(result)

     

    with open("e:\\test\\result.txt",'w',encoding="utf-8") as fp1:

                fp1.write(str(result))

     

    结果如下:

     

     

    根据时间段筛选数据成功。

     

    2、  计算筛选出的数据条目

    因为筛选出的数据类型为list,所以通过len函数就可以得到筛选结果的总数。(如果不是list格式,想必大家都知道可以用for循环或者count函数求合计值,达到一样的效果)

    代码如下:

    print("满足条数的数据:",len(list(filter(get_data,newdata))))

     

     

    得出的数据,和传输的数据条目一致。此接口的传输是成功的。

     

     

    二、正则表达式匹配方法

     

    1、  日期比对

    列表中嵌套的每个字典中都有一个’shelf_version’字段(也就是想获取的时间信息字段),使用for循环,循环取出。循环次数是newdata列表长度。

     

    代码如下:

     

    for i in range(len(newdata)):

        date=newdata['shelf_version']

     

    每次循环取出时间的时候,使用正则表达式进行时间比对。需要进行判断,匹配成功的,才能写入结果文档中。

     

    正则表达式如下(两种都可以,在for循环内部执行):

        mt = re.findall(r"2019-03-21 1[0-1]:.*",date)

    #mt = re.findall(r"2019-03-21 1[0-1]:\d{2}:\d{2}",date)

     

    匹配的是2019-03-21 10点至12点之间的数据。

     

    写入结果文档代码如下(在for循环内部执行):

     

        if date in mt:

            with open("e:\\test\\result.txt",'a',encoding="utf-8") as fp1:

                fp1.write(str(mt))

            print(mt)

     

    此处需要注意,由于是放在for循环中,多次打开文档,所以打开文档写入模式,应该是“a”追加写。否则每次只能保存一个数据比对结果。

    并且,调试程序的时候,应该每次执行前都删掉result.txt文档、重新生成,否则执行代码时,调试的所有结果都会记录在这个文档中,会造成代码错误的误导。

     

    执行结果如下:

     

     

    根据时间段筛选数据成功,筛选出的是2019-03-21 10点至12点之间的数据。

     

    2、  计算筛选出的数据条目

    如果想要计算匹配成功的条目数,可以用一个变量count,每次写入文档的时候,计数加一。(此处代码相信大家都会,略过)

     

     

    得出的数据,和传输的数据条目一致。与第一种方法计算出的合计值相同,正则匹配方法成功。

     

     

    由于是新手,可能实现方法有点复杂,还请大神们有更好的筛选方法,能不吝赐教,在评论区留言。欢迎批评指正。

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-12-23 08:36 , Processed in 0.065818 second(s), 30 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表