Python数据处理(一)-20Gtxt文件提取并分类整理输出作图

 系列文章:

0、基本常用功能及其操作(本文操持更新)

1, 20Gtxt文件提取并分类整理输出作图(本文)

2,TXT文件数据归类整理以及处理

3,txt文件数据提取处理并可视化作图

4,上万行log数据提取并作图进阶版

5、上万行数据提取并分类进阶版

6、.......... (待定)

近几年呢,随着人工智能的兴起,Python使用的越来越多,基本上被誉为万能,都能干点。

而本系列则是专门做数据处理的。

 若想了解图像处理相关内容,Python-jupyternotebook-图像基本处理

 一、实现目标

假设现在 XX.txt 文件中有很多的(杂乱无章的)数据,数据格式如下。

 而我们的需求则是,根据不同的dut,代表不同的硬件。

而我们需要分别提取出TPP,然后进行数据处理。

 二、分步实现

 1、读取XX.txt文件,并识别每一行dut=后面的数据

 这个还得看文件大小,分别有两种方式,但是,大文件(10G,20G的这种)读取的方式,小文件也可以,所以只用一种也行。

 因为我这边有16个DUT,所以得创建16个列表,和文件。大家可自行创建

 保存log的时候,可以根据自己保存的log形式自行选择识别算法,一般有两种

1)正则表达式,这时候log的数据形式,需要提取的数据前后需要独特,否则数据会重复

2)空格表示:数据与数据间用空格隔开,Python识别的时候,会自动把空格作为间隔,可以直接找到对应的数据类似数组(0开始),找到对应的存入列表揪行。

 设计到txt文件,大家可以去学习一下文件操作,打开关闭啊,只读,可读可写,基本上C语言有,所以大家应该都差不多。

def read_dut(file_path,base_addr):
    # 用正则表达式匹配dut=后面的值
    dut_regex = re.compile(r'dut=(\d+)')
    # 分别用于保存不同dut数据的列表
    dut1_data = []
    dut2_data = []
    dut3_data = []
    dut4_data = []
    dut5_data = []
    dut6_data = []
    dut7_data = []
    dut8_data = []
    dut9_data = []
    dut10_data = []
    dut11_data = []
    dut12_data = []
    dut13_data = []
    dut14_data = []
    dut15_data = []
    dut16_data = []

    # 读取txt文件
    with open(file_path, 'r') as f:
        for line in f:
            # 匹配dut值
            match = dut_regex.search(line)
            if match:
                dut = int(match.group(1))
            else:
                continue
            # 根据dut值将数据放入相应的列表
            if dut == 1:
                dut1_data.append(line)
            elif dut == 2:
                dut2_data.append(line)
            elif dut == 3:
                dut3_data.append(line)
            elif dut == 4:
                dut4_data.append(line)
            elif dut == 5:
                dut5_data.append(line)
            elif dut == 6:
                dut6_data.append(line)
            elif dut == 7:
                dut7_data.append(line)
            elif dut == 8:
                dut8_data.append(line)
            elif dut == 9:
                dut9_data.append(line)
            elif dut == 10:
                dut10_data.append(line)
            elif dut == 11:
                dut11_data.append(line)
            elif dut == 12:
                dut12_data.append(line)
            elif dut == 13:
                dut13_data.append(line)
            elif dut == 14:
                dut14_data.append(line)
            elif dut == 15:
                dut15_data.append(line)
            elif dut == 16:
                dut16_data.append(line)

    # 分别保存不同dut数据的txt文件
    with open(base_addr+'dut1_data.txt', 'w') as f:
        f.writelines(dut1_data)
    with open(base_addr+'dut2_data.txt', 'w') as f:
        f.writelines(dut2_data)
    with open(base_addr+'dut3_data.txt', 'w') as f:
        f.writelines(dut3_data)
    with open(base_addr+'dut4_data.txt', 'w') as f:
        f.writelines(dut4_data)
    with open(base_addr+'dut5_data.txt', 'w') as f:
        f.writelines(dut5_data)
    # 分别保存不同dut数据的txt文件
    with open(base_addr+'dut6_data.txt', 'w') as f:
        f.writelines(dut6_data)
    with open(base_addr+'dut7_data.txt', 'w') as f:
        f.writelines(dut7_data)
    with open(base_addr+'dut8_data.txt', 'w') as f:
        f.writelines(dut8_data)
    with open(base_addr+'dut9_data.txt', 'w') as f:
        f.writelines(dut9_data)
    with open(base_addr+'dut10_data.txt', 'w') as f:
        f.writelines(dut10_data)
    # 分别保存不同dut数据的txt文件
    with open(base_addr+'dut11_data.txt', 'w') as f:
        f.writelines(dut11_data)
    with open(base_addr+'dut12_data.txt', 'w') as f:
        f.writelines(dut12_data)
    with open(base_addr+'dut13_data.txt', 'w') as f:
        f.writelines(dut13_data)
    with open(base_addr+'dut14_data.txt', 'w') as f:
        f.writelines(dut14_data)
    with open(base_addr+'dut15_data.txt', 'w') as f:
        f.writelines(dut15_data)
    with open(base_addr+'dut16_data.txt', 'w') as f:
        f.writelines(dut16_data)
    print('dut提取完成')

 这一步的数据便是如下图所示:

 2、提取每个DUT中TPP数据

 上一步我们把不同DUT数据都提取出来了,接下来就可以分别进行数据提取和处理了

 获取TPP后面的值,这个算法也和上面一样两种方法。正则表达式者空格隔离法

 1,因为每一步单个步骤都用函数封装起来了,所以数据传递是直接写出到txt文件,

2,但是可以直接用列表传递,在函数括号里面加个参数就行。

def get_tpp(base_addr):
    # 定义正则表达式,用于匹配TPP=和uS之间的内容
    tpp_regex1 = re.compile(r'TPP=(.*?)uS')
    # 循环读取每个dut数据文件,提取TPP和uS之间的内容,并保存为txt文件
    for i in range(1, 17):
        # 构造文件名
        file_name = base_addr + f'dut{i}.txt'
        out_file_name = base_addr + f'tpp{i}.txt'
        if i == 16:
            print("TPP提取完成")
        # 打开文件和输出文件
        with open(file_name, 'r') as f, open(out_file_name, 'w') as out_f:
            for line in f:
                # 使用正则表达式匹配TPP和uS之间的内容
                match = tpp_regex1.search(line)
                if match:
                    tpp_value = match.group(1)
                    # 将提取的内容写入输出文件
                    out_f.write(f'{tpp_value}\n')

 提取到的数据如下图所示:

 

 3、数据处理

接下来就是把数据可视化,数据几个一组,求最值啊,平均值啊,或者其他其他

我这里是求最大、小值和平均值,16个一组。

 这里也是从tpp.txt文件中提取数据(由于16个DUT的存在,所以我加了个循环,不然得一个一个改文件名,非常的繁琐

 然后还有作图:这个也非常简单,标题,XYZ轴和刻度。分别有函数。

可参考:Python-图强处理实践

def tpp16_pic(base_addr,pic_path):
    for i in range(1, 17):
        file_name = base_addr + "tpp" + str(i) + ".txt"
        pic_name = base_addr + pic_path + 'tpp-' + str(i) + ".png"
        tu_title = "dut" + str(i)
        data = []
        with open(file_name, 'r') as f:
            for line in f:
                data.append(float(line.strip()))
        if len(data) == 0:
            print(tu_title+'没有数据')
        else:
            # 将数据分成 256 个为一组
            data = np.array(data, dtype=np.float32)
            data_groups = np.split(data, range(16, len(data), 16))
            # 计算每组的最大、最小、平均值
            max_values = np.array([np.max(group) for group in data_groups])
            min_values = np.array([np.min(group) for group in data_groups])
            mean_values = np.array([np.mean(group) for group in data_groups])

            plt.scatter(range(len(max_values)), max_values, s=0.5, c="r", label="Max Values")
            plt.scatter(range(len(min_values)), min_values, s=0.5, c="g", label="Min Values")
            plt.scatter(range(len(mean_values)), mean_values, s=0.5, c="b", label="Mean Values")
            plt.ylim(min(data) - 1, max(data) + 1)
            plt.xlabel("cycle Groups (16 Data Points per Group)")
            plt.ylabel("TPP Values(uS)")
            plt.title(tu_title)
            plt.savefig(pic_name)  # 保存为png图片
            plt.close()  # 关闭当前绘图窗口
    print("Tpp-散点图绘制完成!")

其他的数据也是同理,在这里推荐一个好用的东西GPT,Python的代码基本上大多都可以自动生成,

但是有一个问题就是,你得明确你的需求。

同时你得会会Python的基础,比如语法啊,基本数据结构啊,像列表,字典等等等等。

因为GPT给出的都需要一定量的修改,同时也可以更好的提出需求。

而这个有两种,一是GPT,二是百度的文心一言

 1,这个是GPT,edge浏览器里面的插件,新标签页,还有其他插件,大家自行探索。

 2,文心一言,这个得去百度申请(时间可能有点慢,我当初申请后四个月才收到回复,现在可能要不了那么久),免费的。

 

  • 24
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值