一个使用pyqt的word文档查重工具

一个使用pyqt的word文档查重工具

  • 使用场景
  • 代码
  • 使用截图
  • 打包好的软件下载链接
  • 结尾

使用场景

有时我们在借鉴一篇文档之后还不想有太多重复,这个时候可以使用这个工具对两个word文档进行对比

代码

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget, QLabel, QFileDialog
from docx import Document
import re, datetimeclass WordComparerApp(QMainWindow):def __init__(self):super().__init__()self.initUI()def initUI(self):self.setWindowTitle('Word 文档比较器')self.setGeometry(100, 100, 400, 200)self.centralWidget = QWidget(self)self.setCentralWidget(self.centralWidget)self.layout = QVBoxLayout()self.file1_label = QLabel('选择文件1:')self.layout.addWidget(self.file1_label)self.file1_button = QPushButton('选择文件1')self.file1_button.clicked.connect(self.openFile1)self.layout.addWidget(self.file1_button)self.file2_label = QLabel('选择文件2:')self.layout.addWidget(self.file2_label)self.file2_button = QPushButton('选择文件2')self.file2_button.clicked.connect(self.openFile2)self.layout.addWidget(self.file2_button)self.compare_button = QPushButton('开始比较')self.compare_button.clicked.connect(self.compareFiles)self.layout.addWidget(self.compare_button)self.centralWidget.setLayout(self.layout)def openFile1(self):options = QFileDialog.Options()file1, _ = QFileDialog.getOpenFileName(self, "选择文件1", "", "Word Files (*.docx)", options=options)if file1:self.file1_label.setText(f'选择文件1: {file1}')self.file1 = file1def openFile2(self):options = QFileDialog.Options()file2, _ = QFileDialog.getOpenFileName(self, "选择文件2", "", "Word Files (*.docx)", options=options)if file2:self.file2_label.setText(f'选择文件2: {file2}')self.file2 = file2def compareFiles(self):if hasattr(self, 'file1') and hasattr(self, 'file2'):doc1 = self.readDocx(self.file1)doc2 = self.readDocx(self.file2)print('开始比对...'.center(80, '*'))t1 = datetime.datetime.now()for i in range(len(doc1)):if i % 100 == 0:print('处理进行中,已处理段落 {0:>4d} (总数 {1:0>4d} ) '.format(i, len(doc1)))for j in range(len(doc2)):self.compareParagraph(doc1, i, doc2, j)t2 = datetime.datetime.now()print('\n比对完成,总用时: ', t2 - t1)def getText(self, wordname):d = Document(wordname)texts = []for para in d.paragraphs:texts.append(para.text)return textsdef msplit(self, s, separators=',|\.|\?|,|。|?|!'):return re.split(separators, s)def readDocx(self, docfile):print('*' * 80)print('文件', docfile, '加载中……')t1 = datetime.datetime.now()paras = self.getText(docfile)segs = []for p in paras:temp = []for s in self.msplit(p):if len(s) > 2:temp.append(s.replace(' ', ""))if len(temp) > 0:segs.append(temp)t2 = datetime.datetime.now()print('加载完成,用时: ', t2 - t1)self.showInfo(segs, docfile)return segsdef showInfo(self, doc, filename='filename'):chars = 0segs = 0for p in doc:for s in p:segs = segs + 1chars = chars + len(s)print('段落数: {0:>8d} 个。'.format(len(doc)))print('短句数: {0:>8d} 句。'.format(segs))print('字符数: {0:>8d} 个。'.format(chars))def compareParagraph(self, doc1, i, doc2, j, min_segment=5):p1 = doc1[i]p2 = doc2[j]len1 = sum([len(s) for s in p1])len2 = sum([len(s) for s in p2])if len1 < 10 or len2 < 10:return []lst = []for s1 in p1:if len(s1) < min_segment:continuefor s2 in p2:if len(s2) < min_segment:continueif s2 in s1:lst.append(s2)elif s1 in s2:lst.append(s1)count = sum([len(s) for s in lst])ratio = float(count) / min(len1, len2)if count > 10 and ratio > 0.1:print(' 发现相同内容 '.center(80, '*'))print('文件1第{0:0>4d}段内容:{1}'.format(i + 1, p1))print('文件2第{0:0>4d}段内容:{1}'.format(j + 1, p2))print('相同内容:', lst)print('相同字符比:{1:.2f}%\n相同字符数: {0}\n'.format(count, ratio * 100))return lstdef main():app = QApplication(sys.argv)ex = WordComparerApp()ex.show()sys.exit(app.exec_())if __name__ == '__main__':main()

使用截图

在这里插入图片描述

打包好的软件下载链接

文档查重器

结尾

如果觉得文章对你有用请点赞、关注 ->> 你的点赞对我太有用了
群内交流更多技术
130856474 <-- 在这里

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/428023.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机设计大赛 交通目标检测-行人车辆检测流量计数 - 计算机设计大赛

文章目录 0 前言1\. 目标检测概况1.1 什么是目标检测&#xff1f;1.2 发展阶段 2\. 行人检测2.1 行人检测简介2.2 行人检测技术难点2.3 行人检测实现效果2.4 关键代码-训练过程 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 毕业设计…

Hudi学习笔记(一)

大数据发展背景 Hudi用于管理分布式文件系统上大型分析数据集存储&#xff0c;支持Spark和Flink整合。它能够是DFS数据集在分钟级时延内支持变更&#xff0c;也支持下游系统对这个数据集的增量处理。 学习目标 什么是数据湖为什么使用数据湖Hudi基本功能如何编译Hudi源码Hud…

NAT地址转换协议

目录 NAT应用场景静态NAT动态NATNAPTEasy IPNAT服务器 点击跳转NAT配置&#xff08;动态nat&#xff0c;静态nat&#xff0c;Easy IP&#xff09; NAT应用场景 - 随着网络设备的数量不断增长&#xff0c;对IPv4地址的需求也不断增加&#xff0c;导致可用IPv4地址空间逐渐耗尽…

Mysql全局优化

Mysql全局优化总结 从上图可以看出SQL及索引的优化效果是最好的&#xff0c;而且成本最低&#xff0c;所以工作中我们要在这块花更多时间。 补充一点配置文件my.ini或my.cnf的全局参数&#xff1a; 假设服务器配置为&#xff1a; CPU&#xff1a;32核内存&#xff1a;64GDIS…

利用git上传本地文件

1、建立仓库 2.然后刷新网站&#xff0c;获取下载链接&#xff0c;备用。 3、接下来在本地创建一个文件夹&#xff0c; 4、把github上面的仓库克隆到本地 git clone https://github.com/xxxxx&#xff08;https://github.com/xxxxx替换成你之前复制的地址&#xff09; 5、把…

树莓派基础应用:智能家居监控系统

引言&#xff1a; 随着智能家居的普及&#xff0c;家居安全与监控逐渐成为人们关注的焦点。树莓派作为一种功能强大的迷你计算机&#xff0c;为我们提供了实现智能家居监控系统的可能。在本篇博客中&#xff0c;我们将通过构建一个简单的智能家居监控系统&#xff0c;来探索树莓…

uniapp组件库Modal 模态框 的使用方法

目录 #平台差异说明 #基本使用 #传入富文本内容 #异步关闭 #点击遮罩关闭 #控制模态框宽度 #自定义样式 #缩放效果 #API #Props #Event #Method #Slots 弹出模态框&#xff0c;常用于消息提示、消息确认、在当前页面内完成特定的交互操作。 #平台差异说明 AppH5微…

redis的数据类型

Redis 提供了丰富的数据类型&#xff0c;常见的有五种&#xff1a;String&#xff08;字符串&#xff09;&#xff0c;Hash&#xff08;哈希&#xff09;&#xff0c;List&#xff08;列表&#xff09;&#xff0c;Set&#xff08;集合&#xff09;、Zset&#xff08;有序集合&…

IT6510FN IT6510FN/HW 转换器芯片 QFN封装

描述&#xff1a; IT6510是一款高性能的单芯片显示端口到MIPI-CSI/DSI转换器。结合DisplayPort接收器、MIPI发射器&#xff0c;IT6510支持DisplayPort输入和MIPI- csi /DSI输出转换功能。 内置的DisplayPort接收器完全兼容DisplayPort 1.2a和HDCP 1.3/2.3规格。通过4通道HBR2…

ERP读书笔记20240125-1

ERP&#xff08;Enterprise Resource Planning&#xff0c;企业资源计划&#xff09;的发展经历了从 MRP&#xff08;Material Requirements Planning&#xff0c;物料需求计划&#xff09;到 MRP2&#xff08;Manufacturing Resources Planning&#xff0c;制造资源计划&#…

linux安装docker--更具官网教程

1.访问https://docs.docker.com/ 2.进入download 3输入cento 或者直接访问地址Install Docker Engine on CentOS | Docker Docs 4一步一步根据官网命令走 2安装 3 4 方式一&#xff1a; service docker start&#xff08;开启&#xff09; service docker status&#xff08…

3d导模型赋予材质方法---模大狮模型网

给3D模型赋予材质的方法可以根据您使用的软件和工作流程而有所不同。以下是一般的步骤&#xff0c;您可以根据自己的情况进行调整&#xff1a; 准备模型&#xff1a;首先&#xff0c;确保您的模型已经完全建模并进行了UV映射。UV映射是将2D纹理坐标应用到3D模型表面的过程&…