打算用Python 开发一个桌面应用,实现排量获取txt文件,使用正则表达式判断每行前面以“SVSPOTMOV”开头的整行全所内容抽取数据并保存抽取记录,可通过查找选择查看历史数据,能说说怎么实现吗?写出代码
时间: 2024-02-18 11:05:31 浏览: 112
好的,你可以使用Python的PyQt5模块来实现桌面应用程序的开发,使用re模块来实现正则表达式的匹配,使用文件操作来保存和读取数据。下面是一个示例代码,可以实现你的功能:
```python
import re
import os
from PyQt5.QtWidgets import QApplication, QWidget, QTextEdit, QVBoxLayout, QHBoxLayout, QPushButton, QLabel, QFileDialog, QListWidget, QMessageBox
class MyWindow(QWidget):
def __init__(self):
super().__init__()
# 创建文本框和按钮
self.text_edit = QTextEdit()
self.extract_button = QPushButton('抽取数据')
self.save_button = QPushButton('保存记录')
self.open_button = QPushButton('打开文件')
self.delete_button = QPushButton('删除记录')
self.list_widget = QListWidget()
# 将按钮点击事件和对应函数关联
self.extract_button.clicked.connect(self.extract_data)
self.save_button.clicked.connect(self.save_records)
self.open_button.clicked.connect(self.open_file)
self.delete_button.clicked.connect(self.delete_record)
# 创建布局并将文本框和按钮添加到布局中
button_layout = QHBoxLayout()
button_layout.addWidget(self.extract_button)
button_layout.addWidget(self.save_button)
button_layout.addWidget(self.open_button)
button_layout.addWidget(self.delete_button)
main_layout = QVBoxLayout()
main_layout.addWidget(self.text_edit)
main_layout.addLayout(button_layout)
main_layout.addWidget(QLabel('历史记录:'))
main_layout.addWidget(self.list_widget)
# 设置窗口布局
self.setLayout(main_layout)
# 初始化历史记录
self.load_records()
def extract_data(self):
# 获取文本框中的所有数据
data = self.text_edit.toPlainText()
# 遍历每行数据
records = []
for line in data.split("\n"):
# 判断每行前面以“SVSPOTMOV”开头的整行全所内容
if line.startswith("SVSPOTMOV"):
# 使用正则表达式抽取需要的数据
match = re.search(r'SVSPOTMOV\|(\d+)\|(\d+)\|(\d+)', line)
if match:
data1 = match.group(1)
data2 = match.group(2)
data3 = match.group(3)
# 添加记录
records.append((data1, data2, data3))
# 在历史记录中添加新记录
if records:
self.add_records(records)
def save_records(self):
# 获取历史记录文件名
filename, _ = QFileDialog.getSaveFileName(self, '保存记录', '.', 'Text Files (*.txt)')
# 如果文件名不为空,则保存历史记录到文件中
if filename:
with open(filename, 'w') as f:
for record in self.get_records():
f.write(f"{record[0]}\t{record[1]}\t{record[2]}\n")
def open_file(self):
# 选择历史记录文件
filename, _ = QFileDialog.getOpenFileName(self, '打开文件', '.', 'Text Files (*.txt)')
# 如果文件名不为空,则从文件中加载历史记录
if filename:
with open(filename, 'r') as f:
records = []
for line in f:
data1, data2, data3 = line.strip().split('\t')
records.append((data1, data2, data3))
self.set_records(records)
QMessageBox.information(self, '提示', '历史记录加载成功!')
def delete_record(self):
# 获取选中的历史记录
selected_items = self.list_widget.selectedItems()
# 删除选中的历史记录
for item in selected_items:
index = self.list_widget.row(item)
self.list_widget.takeItem(index)
# 保存删除后的历史记录
self.save_records()
def add_records(self, records):
# 在历史记录列表中添加新记录
for record in records:
self.list_widget.addItem(f"{record[0]}\t{record[1]}\t{record[2]}")
def set_records(self, records):
# 清空历史记录列表,并设置新的历史记录
self.list_widget.clear()
self.add_records(records)
def get_records(self):
# 获取历史记录
records = []
for index in range(self.list_widget.count()):
record = self.list_widget.item(index).text().split('\t')
records.append((record[0], record[1], record[2]))
return records
def load_records(self):
# 加载历史记录文件
filename = 'records.txt'
if os.path.exists(filename):
with open(filename, 'r') as f:
records = []
for line in f:
data1, data2, data3 = line.strip().split('\t')
records.append((data1, data2, data3))
self.set_records(records)
def save_records_file(self):
# 保存历史记录到文件
filename = 'records.txt'
with open(filename, 'w') as f:
for record in self.get_records():
f.write(f"{record[0]}\t{record[1]}\t{record[2]}\n")
def closeEvent(self, event):
# 保存历史记录,并退出应用程序
self.save_records_file()
event.accept()
if __name__ == '__main__':
app = QApplication([])
window = MyWindow()
window.show()
app.exec_()
```
这段代码定义了一个名为MyWindow的类,继承了QWidget类,表示应用程序的主窗口。在窗口中,有一个文本框和几个按钮,包括“抽取数据”、“保存记录”、“打开文件”和“删除记录”。在点击“抽取数据”按钮时,程序会遍历文本框中的每行数据,使用正则表达式抽取以“SVSPOTMOV”开头的整行数据,并将抽取到的数据添加到历史记录中。在点击“保存记录”按钮时,程序会将历史记录保存到文件中。在点击“打开文件”按钮时,程序会从文件中加载历史记录。在点击“删除记录”按钮时,程序会删除选中的历史记录。在程序退出时,程序会自动保存历史记录到文件中。
阅读全文