系列文章:
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,文心一言,这个得去百度申请(时间可能有点慢,我当初申请后四个月才收到回复,现在可能要不了那么久),免费的。