Python解决数据筛选问题

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

业务需求:

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

前提条件:

本接口是实时传输。

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

解决方法:

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

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

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

 

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

 

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

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[i]['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,每次写入文档的时候,计数加一。(此处代码相信大家都会,略过)

 

 

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

 

 

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

转载于:https://www.cnblogs.com/asi2662/p/10723590.html

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值