赞
踩
介绍
本文将介绍如何使用PyQt5开发一个提取工具,该工具可以从指定文件夹中的图片中提取出指定格式的文本信息,并按照指定规则进行排序和去重,最终输出为txt文件。在开发过程中,我们将会学习到以下内容:
工具特点
界面预览
界面包含三个主要组件:
代码实现
我们将代码分为两个部分,第一部分是PyQt5界面的搭建和逻辑的实现,第二部分是文本识别和数据处理的实现。
PyQt5界面的搭建和逻辑的实现
首先需要引入必要的库:
import os
import re
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
import pytesseract
然后定义一个Ui_Form类,用于设置界面的布局和初始化控件。
class Ui_Form(object): def setupUi(self, Form): Form.setObjectName("Form") Form.resize(466, 283) self.pushButton = QtWidgets.QPushButton(Form) self.pushButton.setGeometry(QtCore.QRect(180, 240, 93, 28)) self.pushButton.setObjectName("pushButton") self.lineEdit = QtWidgets.QLineEdit(Form) self.lineEdit.setGeometry(QtCore.QRect(150, 20, 201, 31)) self.lineEdit.setObjectName("lineEdit") self.label = QtWidgets.QLabel(Form) self.label.setGeometry(QtCore.QRect(10, 30, 131, 16)) self.label.setObjectName("label") self.comboBox = QtWidgets.QComboBox(Form) self.comboBox.setGeometry(QtCore.QRect(40, 80, 87, 22)) self.comboBox.setObjectName("comboBox") self.comboBox.addItem("") self.comboBox.addItem("") self.textBrowser = QtWidgets.QTextBrowser(Form) self.textBrowser.setGeometry(QtCore.QRect(180, 80, 271, 131)) self.textBrowser.setObjectName("textBrowser") self.pushButton_2 = QtWidgets.QPushButton(Form) self.pushButton_2.setGeometry(QtCore.QRect(360, 20, 93, 28)) self.pushButton_2.setObjectName("pushButton_2") self.label_2 = QtWidgets.QLabel(Form) self.label_2.setGeometry(QtCore.QRect(30, 120, 131, 41)) self.label_2.setText("") self.label_2.setObjectName("label_2") self.retranslateUi(Form) self.pushButton_2.clicked.connect(Form.get_folder) # type: ignore self.pushButton.clicked.connect(Form.run_ocr) # type: ignore QtCore.QMetaObject.connectSlotsByName(Form) def retranslateUi(self, Form): _translate = QtCore.QCoreApplication.translate Form.setWindowTitle(_translate("Form", "提取工具")) self.pushButton.setText(_translate("Form", "开始提取")) self.label.setText(_translate("Form", "获取图片文件路径:")) self.comboBox.setItemText(0, _translate("Form", "=1/22.")) self.comboBox.setItemText(1, _translate("Form", "规则2")) self.pushButton_2.setText(_translate("Form", "浏览"))
接下来是主要的逻辑实现,定义一个MyForm类,继承自QtWidgets.QWidget和Ui_Form,实现两个主要功能:获取文件夹路径和运行OCR程序。
class MyForm(QtWidgets.QWidget, Ui_Form): def __init__(self): super().__init__() self.setupUi(self) def get_folder(self): folder_path = QtWidgets.QFileDialog.getExistingDirectory(self, "选取文件夹", "/") self.lineEdit.setText(folder_path) def run_ocr(self): folder_path = self.lineEdit.text() if not os.path.isdir(folder_path): QtWidgets.QMessageBox.warning(self, "错误", "请指定正确的文件夹路径") return regex_list = ["[=]\w+[/]\d+", "[=]\w+[/]\d{3}|[=]\w+[/]\d{1}", r'[=]\w+[/]\d+'] # 三种正则表达式 regex_idx = self.comboBox.currentIndex() regex = regex_list[regex_idx] file_list = os.listdir(folder_path) image_file_list = [] for filename in file_list: file_path = os.path.join(folder_path, filename) file_ext = os.path.splitext(file_path)[1].lower() if file_ext in ['.jpg', '.jpeg', '.png', '.bmp']: image_file_list.append(file_path) if len(image_file_list) == 0: QtWidgets.QMessageBox.warning(self, "错误", "文件夹内没有图片格式的文件") return self.label_2.setText("正在提取...") QtWidgets.QApplication.processEvents() for file_path in image_file_list: text = extract_text(file_path) append_text_to_file(text, folder_path) QtWidgets.QApplication.processEvents() # 定期处理事件队列,保证应用程序响应性 result = extract_regex_from_file(regex, folder_path) formatted_result = format_list(result) self.textBrowser.setText(formatted_result) self.label_2.setText("提取完成")
接下来,我们需要定义一些辅助函数,用于实现主要逻辑中提到的功能。
文本识别和数据处理的实现
首先是使用Pytesseract库提取图片中的文本信息的函数。
def extract_text(file_path: str) -> str:
return pytesseract.image_to_string(file_path, lang='eng')
然后是向指定文件夹中的data.txt文件追加文本信息的函数。
def append_text_to_file(text: str, folder_path: str):
with open(os.path.join(folder_path, 'data.txt'), 'a+', encoding="utf-8") as f:
f.write(text + '\n')
接下来是使用正则表达式从data.txt文件中提取指定格式文本信息的函数,同时也会将结果输出为txt文件。
def extract_regex_from_file(regex: str, folder_path: str) -> List[str]:
with open(os.path.join(folder_path, 'data.txt'), 'r', encoding='utf-8') as f:
content = f.read()
pattern = re.compile(regex)
result = pattern.findall(content)
result = list(set(result))
result.sort(key=lambda x: (x[1], x[3])) # 按照序号排序
# 将结果输出为txt文本
with open(os.path.join(folder_path, 'result.txt'), 'w', encoding="utf-8") as f:
f.write('\n'.join(result))
return result
最后一个函数将处理后的数据格式化并返回为字符串,用于显示在界面上。
def format_list(data: List[str]) -> str:
lines = []
for item in data:
lines.append(f'{item}\n')
return ''.join(lines)
完整代码
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。