当前位置: 首页 > news >正文

python_根据关键词匹配文件中的数据并绘图

根据关键词匹配文件中特定的数值,然后绘制曲线图;

# 导远los数据的eph & ssr & los num曲线
import os
import matplotlib.pyplot as plt
import re
from PyQt5.QtWidgets import QApplication, QDialog, QVBoxLayout, QLabel, QLineEdit, QPushButton, QFileDialogplt.rcParams["font.sans-serif"] = ["SimHei"]  # 设置显示中文字体
plt.rcParams["axes.unicode_minus"] = False  # 设置正常显示符号# os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"
# os.environ["CUDA_VISIBLE_DEVICES"] = "1"class MyDialog(QDialog):def __init__(self, parent=None):super(MyDialog, self).__init__(parent)self.setWindowTitle('nLos_绘图工具')self.setGeometry(100, 100, 200, 200)# 创建垂直布局管理器layout = QVBoxLayout()# 创建文件选择框label3 = QLabel('请点击浏览按钮,选择nLos的log文件;\n再点击执行按钮,绘制曲线。', self)layout.addWidget(label3)self.file_input1 = QPushButton('浏览...', self)layout.addWidget(self.file_input1)self.file_input1.clicked.connect(self.open_file_dialog1)# 添加确认执行按钮self.ok_button = QPushButton('执行', self)self.ok_button.clicked.connect(self.execute)layout.addWidget(self.ok_button)# 将布局设置为主窗口的布局self.setLayout(layout)def open_file_dialog1(self):file_dialog = QFileDialog(self)file_dialog.setFileMode(QFileDialog.ExistingFiles)if file_dialog.exec_():file_paths = file_dialog.selectedFiles()merged_filename = ""if len(file_paths) > 1:# 获取第一个文件的目录和文件名,用于创建合并后的文件名directory = os.path.dirname(file_paths[0])filename = os.path.splitext(os.path.basename(file_paths[0]))[0]merged_filename = os.path.join(directory, f'{filename}_merged').replace('\\', '/')with open(merged_filename, 'w') as merged_file:for path in file_paths:with open(path, 'r') as file:merged_file.write(file.read())merged_file.write('\n')  # 在每个文件之间添加换行符elif len(file_paths) == 1:merged_filename = file_pathselse:print('Please select files.')if merged_filename:self.file_input1.setText(''.join(merged_filename))def execute(self):# 执行操作,可以在这里处理输入框和文件选择框的内容file_path_s = self.file_input1.text()# 匹配的关键字keyword_s = 'start time'keyword_i = 'input.time'keyword_e = 'eph num'keyword_d = 'dpi_sdk ssr num'keyword_l = 'nLos'with open(file_path_s, 'r', encoding="utf-8", errors="ignore") as file:lines = file.readlines()it_list, en_list, dn_list, ln_list = [], [], [], []it = 0for index, line in enumerate(lines):# 匹配相近的两行关键词if line.startswith(keyword_e) and lines[index + 1].startswith(keyword_d):# 空格分隔,去掉末尾的换行en = line.split(' ')[-1].strip('\n')dn = lines[index + 1].split(' ')[-1].strip('\n')# 解决绘图时,y轴排序错乱问题,字符转换成整型en_list.append(int(en))dn_list.append(int(dn))# 匹配nLos关键词if keyword_l in line:# 空格分隔,去掉末尾的换行ln = re.split("[,| |:|=]+", line)[4]# print(ln)it = re.split("[,| |:|=]+", line)[-1].strip('\n')# print(it)ln_list.append(int(ln))it_list.append(it)# 剔除掉第一个# ln_list.pop(0)# print(len(ln_list))# 添加标签和标题plt.xlabel('时间')plt.ylabel('数值')# plt.title(keyword_e + ' & ' + keyword_d + ' & ' + keyword_l, fontsize=24)file_name = os.path.basename(file_path_s)plt.title(file_name, fontsize=24)# 显示网格线和设置背景色plt.grid(True)plt.gca().set_facecolor('lightgrey')# plt.plot(it_list, en_list, it_list, dn_list)# linestyle = "--" 表示虚线,“:”表示点虚线,"-."表示点划线,plt.plot(it_list, en_list, linestyle='--', label=keyword_e, marker='o')plt.plot(it_list, dn_list, linestyle=':', label=keyword_d, marker='v')plt.plot(it_list, ln_list, linestyle='-.', label=keyword_l, marker=',')# 添加图例plt.legend()# 显示图表plt.show()if __name__ == '__main__':import sysapp = QApplication(sys.argv)dialog = MyDialog()# 解决子窗口不能操作的问题dialog.show()dialog.exec_()

文件中的关键词发生变化,调整后:

# 导远los数据的eph & ssr & los num曲线
import os
import matplotlib.pyplot as plt
from matplotlib.dates import AutoDateLocator
import re
from PyQt5.QtWidgets import QApplication, QDialog, QVBoxLayout, QLabel, QLineEdit, QPushButton, QFileDialogplt.rcParams["font.sans-serif"] = ["SimHei"]  # 设置显示中文字体
plt.rcParams["axes.unicode_minus"] = False  # 设置正常显示符号# os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"
# os.environ["CUDA_VISIBLE_DEVICES"] = "1"class MyDialog(QDialog):def __init__(self, parent=None):super(MyDialog, self).__init__(parent)self.setWindowTitle('los绘图工具')self.setGeometry(100, 100, 200, 200)# 创建垂直布局管理器layout = QVBoxLayout()# 创建文件选择框label3 = QLabel('请点击浏览按钮,选择los的log文件;\n再点击执行按钮,绘制曲线。\n兼容导远V1.2-V1.4版本', self)layout.addWidget(label3)self.file_input1 = QPushButton('浏览...', self)layout.addWidget(self.file_input1)self.file_input1.clicked.connect(self.open_file_dialog1)# 添加确认执行按钮self.ok_button = QPushButton('执行', self)self.ok_button.clicked.connect(self.execute)layout.addWidget(self.ok_button)# 将布局设置为主窗口的布局self.setLayout(layout)def open_file_dialog1(self):file_dialog = QFileDialog(self)file_dialog.setFileMode(QFileDialog.ExistingFiles)if file_dialog.exec_():file_paths = file_dialog.selectedFiles()merged_filename = ""if len(file_paths) > 1:# 获取第一个文件的目录和文件名,用于创建合并后的文件名directory = os.path.dirname(file_paths[0])filename = os.path.splitext(os.path.basename(file_paths[0]))[0]merged_filename = os.path.join(directory, f'{filename}_merged').replace('\\', '/')with open(merged_filename, 'w') as merged_file:for path in file_paths:with open(path, 'r') as file:merged_file.write(file.read())merged_file.write('\n')  # 在每个文件之间添加换行符elif len(file_paths) == 1:merged_filename = file_pathselse:print('Please select files.')if merged_filename:self.file_input1.setText(''.join(merged_filename))def execute(self):# 执行操作,可以在这里处理输入框和文件选择框的内容file_path_s = self.file_input1.text()# 匹配的关键字keyword_s = 'start'  # 新旧版本的start与time之间的空格不一致keyword_i = 'input.time'keyword_e = 'eph num'keyword_d = 'dpi_sdk ssr num'keyword_l = 'los num'keyword_t = 'time'with open(file_path_s, 'r', encoding="utf-8", errors="ignore") as file:lines = file.readlines()it_list, en_list, dn_list, ln_list = [], [], [], []it = 0for index, line in enumerate(lines):# 匹配相近的三行关键词if line.startswith(keyword_s) and lines[index + 1].startswith(keyword_e) and lines[index + 2].startswith(keyword_d):# 空格分隔,去掉末尾的换行# it = line.split(' ')[-1].strip('\n')en = lines[index + 1].split(' ')[-1].strip('\n')dn = lines[index + 2].split(' ')[-1].strip('\n')# print(it, en, dn)# it_list.append(it)# 解决绘图时,y轴排序错乱问题,字符转换成整型en_list.append(int(en))dn_list.append(int(dn))# 匹配los num关键词if keyword_l in line and lines[index + 1].startswith(keyword_t):# 空格分隔,去掉末尾的换行ln = line.split(' ')[-1].strip('\n')ln_list.append(int(ln))it = re.split("[,| ]+", lines[index + 1])[1].strip('\n')it_list.append(it)# 剔除掉第一个,数量需要相等,不然报错# ln_list.pop(0)# print(len(ln_list))# print(len(it_list), len(ln_list), len(en_list), len(dn_list))# 列表的数量需要相等,不然绘图的时候会报错,切片获取最小长度的列表if len(it_list) > len(en_list):it_list = it_list[:len(en_list)]ln_list = ln_list[:len(en_list)]elif len(it_list) < len(en_list):en_list = en_list[:len(it_list)]dn_list = dn_list[:len(it_list)]# 添加标签和标题plt.xlabel('GPST时间')plt.ylabel('num数值')# plt.title(keyword_e + ' & ' + keyword_d + ' & ' + keyword_l, fontsize=24)file_name = os.path.basename(file_path_s)plt.title(file_name, fontsize=24)# 自动调整刻度plt.gca().xaxis.set_major_locator(AutoDateLocator())# 显示网格线和设置背景色plt.grid(True)plt.gca().set_facecolor('lightgrey')# plt.plot(it_list, en_list, it_list, dn_list)# linestyle = "--" 表示虚线,":"表示点虚线,"-."表示点划线,plt.plot(it_list, en_list, linestyle='--', alpha=0.5, label=keyword_e, marker='o', linewidth=4)plt.plot(it_list, dn_list, linestyle=':', alpha=0.5, label=keyword_d, marker='v', linewidth=1)plt.plot(it_list, ln_list, linestyle='-.', label=keyword_l, marker=',')# 添加图例plt.legend()# 显示图表plt.show()if __name__ == '__main__':import sysapp = QApplication(sys.argv)dialog = MyDialog()# 解决子窗口不能操作的问题dialog.show()dialog.exec_()

相关文章:

  • python学习—字典(Dictionary)
  • 【自动驾驶】运动底盘状态数据:里程计、IMU、运动学分析、串口通信协议
  • 计算机组成原理网课笔记2
  • 【刷力扣】23. 合并 K 个升序链表(dummy节点技巧 + 分治思维 + 优先队列)
  • 番外篇 | YOLOv8算法解析和实战应用:车辆检测 + 车辆追踪 + 行驶速度计算
  • 【shell脚本速成】函数
  • 五十三、openlayers官网示例Layer Spy解析——跟随鼠标透视望远镜效果、图层剪裁
  • LeetCode 3186 最大施法伤害
  • 如何选择适合的LabVIEW版本进行开发
  • 注解详解系列 - @ResponseStatus
  • Java中将文件转换为Base64编码的字节码
  • LabVIEW的热门应用
  • JAVA学习笔记DAY6——SSM_Spring
  • 在Linux上为Windows目标配置Qt交叉编译
  • 鸿蒙开发网络管理:【@ohos.request (上传下载)】
  • .pyc 想到的一些问题
  • - C#编程大幅提高OUTLOOK的邮件搜索能力!
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • Java小白进阶笔记(3)-初级面向对象
  • Python语法速览与机器学习开发环境搭建
  • React-flux杂记
  • spring boot 整合mybatis 无法输出sql的问题
  • vue-cli3搭建项目
  • 基于遗传算法的优化问题求解
  • 前端技术周刊 2019-02-11 Serverless
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 如何设计一个比特币钱包服务
  • 移动端唤起键盘时取消position:fixed定位
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • ​​​【收录 Hello 算法】9.4 小结
  • ‌Excel VBA进行间比法设计
  • # C++之functional库用法整理
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (Note)C++中的继承方式
  • (独孤九剑)--文件系统
  • (函数)颠倒字符串顺序(C语言)
  • (接口封装)
  • (四)c52学习之旅-流水LED灯
  • (自适应手机端)行业协会机构网站模板
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • ***检测工具之RKHunter AIDE
  • .net core 外观者设计模式 实现,多种支付选择
  • .Net Core中Quartz的使用方法
  • .net wcf memory gates checking failed
  • .NET 跨平台图形库 SkiaSharp 基础应用
  • .NET6使用MiniExcel根据数据源横向导出头部标题及数据
  • .Net的C#语言取月份数值对应的MonthName值
  • /etc/skel 目录作用
  • @configuration注解_2w字长文给你讲透了配置类为什么要添加 @Configuration注解
  • @NoArgsConstructor和@AllArgsConstructor,@Builder
  • [ Linux ] Linux信号概述 信号的产生
  • [ vulhub漏洞复现篇 ] Hadoop-yarn-RPC 未授权访问漏洞复现
  • [BUUCTF 2018]Online Tool
  • [BZOJ 4034][HAOI2015]T2 [树链剖分]