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_()