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

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

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, QFileDialog

plt.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_paths
            else:
                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 = 0
            for 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 sys

    app = QApplication(sys.argv)
    dialog = MyDialog()
    # 解决子窗口不能操作的问题
    dialog.show()
    dialog.exec_()

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

python 复制代码
# 导远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, QFileDialog

plt.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_paths
            else:
                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 = 0
            for 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 sys

    app = QApplication(sys.argv)
    dialog = MyDialog()
    # 解决子窗口不能操作的问题
    dialog.show()
    dialog.exec_()
相关推荐
baivfhpwxf20234 分钟前
C# 5000 转16进制 字节(激光器串口通讯生成指定格式命令)
开发语言·c#
许嵩667 分钟前
IC脚本之perl
开发语言·perl
长亭外的少年18 分钟前
Kotlin 编译失败问题及解决方案:从守护进程到 Gradle 配置
android·开发语言·kotlin
直裾18 分钟前
Scala全文单词统计
开发语言·c#·scala
心仪悦悦19 分钟前
Scala中的集合复习(1)
开发语言·后端·scala
JIAY_WX21 分钟前
kotlin
开发语言·kotlin
一念之坤1 小时前
零基础学Python之数据结构 -- 01篇
数据结构·python
代码小鑫1 小时前
A043-基于Spring Boot的秒杀系统设计与实现
java·开发语言·数据库·spring boot·后端·spring·毕业设计