新闻详情

新闻详情

首页 / 资讯中心 / 详情

比较两文件差异python实现

发布时间:2026/11/14 5:24:29来源:尧图网络
比较两文件差异python实现
比较1比较2下面的是GUI方式俩栏颜色对比较适合前后有改动的同一文档import sysfrom difflib import SequenceMatcherfrom PySide6.QtCore import Qt, QRegularExpressionfrom PySide6.QtGui import (QFont, QColor, QSyntaxHighlighter, QTextCharFormat,QTextCursor, QTextDocument)from PySide6.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout,QHBoxLayout, QPlainTextEdit, QPushButton, QFileDialog,QLabel, QSplitter)# ---------- Diff 计算 ----------def compute_diff(a_lines, b_lines):返回 b_lines 的标注列表: (equal|add|del|change, line, a_idx)sm SequenceMatcher(None, a_lines, b_lines, autojunkFalse)result []for tag, i1, i2, j1, j2 in sm.get_opcodes():if tag equal:for k in range(j2 - j1):result.append((equal, b_lines[j1 k], i1 k))elif tag insert:for k in range(j1, j2):result.append((add, b_lines[k], None))elif tag delete:for k in range(i1, i2):result.append((del, a_lines[k], k))elif tag replace:for k in range(j1, j2):result.append((change, b_lines[k], None))for k in range(i1, i2):result.append((del, a_lines[k], k))return result# ---------- 高亮器 ----------COLORS {equal: QColor(#F5F5F5),add: QColor(#C8E6C9), # 浅绿del: QColor(#FFCDD2), # 浅红change: QColor(#FFF59D), # 浅黄}class DiffHighlighter(QSyntaxHighlighter):def __init__(self, doc, marks):super().__init__(doc)self.marks marks # list[bool] —— 长度等于行数def highlightBlock(self, text):block_num self.currentBlock().blockNumber()if block_num len(self.marks) and self.marks[block_num]:fmt QTextCharFormat()fmt.setBackground(QColor(#FFEB3B))fmt.setProperty(QTextCharFormat.Property.FullWidthSelection, True)self.setFormat(0, len(text), fmt)# ---------- 主窗口 ----------class DiffWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle(Python Diff Viewer)self.resize(1200, 700)central QWidget(); self.setCentralWidget(central)v QVBoxLayout(central)# 顶部按钮栏bar QHBoxLayout()self.btn_left QPushButton( 打开左文件)self.btn_right QPushButton( 打开右文件)self.btn_diff QPushButton( 对比)for b in (self.btn_left, self.btn_right, self.btn_diff):bar.addWidget(b)bar.addStretch()v.addLayout(bar)# 左右文本框self.left QPlainTextEdit(); self.left.setFont(QFont(Consolas, 11))self.right QPlainTextEdit(); self.right.setFont(QFont(Consolas, 11))for ed in (self.left, self.right):ed.setLineWrapMode(QPlainTextEdit.LineWrapMode.NoWrap)splitter QSplitter(Qt.Orientation.Horizontal)splitter.addWidget(self._wrap(左文件 (原版本), self.left))splitter.addWidget(self._wrap(右文件 (新版本), self.right))splitter.setSizes([600, 600])v.addWidget(splitter)# 信号self.btn_left.clicked.connect(lambda: self._open(self.left))self.btn_right.clicked.connect(lambda: self._open(self.right))self.btn_diff.clicked.connect(self._run_diff)def _wrap(self, title, edit):w QWidget(); lay QVBoxLayout(w); lay.setContentsMargins(0,0,0,0)lay.addWidget(QLabel(title))lay.addWidget(edit)return wdef _open(self, editor):path, _ QFileDialog.getOpenFileName(self, 选择文件)if path:with open(path, r, encodingutf-8, errorsignore) as f:editor.setPlainText(f.read())def _run_diff(self):a self.left.toPlainText().splitlines()b self.right.toPlainText().splitlines()diff compute_diff(a, b)# --- 左文件按 a 的顺序仅显示 del/equal ---left_marks []left_lines []# 同步高亮把 b 的 add/change 也映射到 a 侧对应行a_highlight set() # 在 a 中需要高亮的行号与 b 的 add/change 对齐# 重新跑一遍以同步两侧位置sm SequenceMatcher(None, a, b, autojunkFalse)a_pos, b_pos 0, 0a_blocks, b_blocks [], []for tag, i1, i2, j1, j2 in sm.get_opcodes():if tag equal:for k in range(i2 - i1):a_blocks.append((equal, a[i1k], i1k))b_blocks.append((equal, b[j1k], j1k))elif tag insert:for k in range(j1, j2):a_blocks.append((pad, , i1))b_blocks.append((add, b[k], j1k))elif tag delete:for k in range(i1, i2):a_blocks.append((del, a[k], i1k))b_blocks.append((pad, , j1))elif tag replace:# 先用 a 行标 del再用 b 行标 add/changefor k in range(i1, i2):a_blocks.append((del, a[k], i1k))b_blocks.append((pad, , j1k))for k in range(j1, j2):a_blocks.append((pad, , i1k))b_blocks.append((change, b[k], j1k))# 渲染到文本框 上色self._render(self.left, a_blocks)self._render(self.right, b_blocks)def _render(self, editor, blocks):editor.setPlainText(\n.join(b[1] for b in blocks))cursor editor.textCursor()cursor.select(QTextCursor.SelectionType.Document)fmt_default QTextCharFormat(); fmt_default.setBackground(QColor(white))cursor.setCharFormat(fmt_default)cursor.clearSelection()for i, (tag, _, _) in enumerate(blocks):color COLORS.get(tag)if not color: continueblock editor.document().findBlockByNumber(i)hl QTextCursor(block)hl.movePosition(QTextCursor.MoveOperation.EndOfBlock,QTextCursor.MoveMode.KeepAnchor)fmt QTextCharFormat(); fmt.setBackground(color)hl.setCharFormat(fmt)editor.viewport().update()if __name__ __main__:app QApplication(sys.argv)w DiffWindow(); w.show()sys.exit(app.exec())但缺行号显示补充
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

【外设】之大彩串口显示屏 2026/11/14 3:51:47

【外设】之大彩串口显示屏

大彩串口屏初步使用 1 .官网下载 STM32 屏幕 GUI 设计资料 http://www.gz-dc.com/category/typeid/4112 找到 STM32 Keil 工程,移植相关代码因项目而异进行移植,由于项目简单,本人只对用到的指令接口进行修改。 比如:注意事项&…

阅读更多 →
无法下载Windows系统iso文件 2026/11/12 23:59:09

无法下载Windows系统iso文件

当我遇到这个问题的时候,我打开了一个网站: 登录 然后我打算下载的时候: 突然那个官方的连接就可以下载了:

阅读更多 →
【清华代码熊】DeepSeek V4.1 Flash 后训练详解 2026/11/13 10:09:00

【清华代码熊】DeepSeek V4.1 Flash 后训练详解

📌 上期解析了 DeepSeek V4.1 Flash 模型架构改进,本期解析 DeepSeek V4.1 Flash 预训练/后训练技术: 🌟 预训练:45T 文本 多模态混合语料、直接训练 sparse attention(取消 DeepSeek V4 的 dense 冷启动&…

阅读更多 →
Shuffle-R1: Efficient RL framework for Multimodal Large Language Models via Data-centric Dynamic ... 2026/11/13 13:31:48

Shuffle-R1: Efficient RL framework for Multimodal Large Language Models via Data-centric Dynamic ...

文章主要内容和创新点 主要内容 本文聚焦于多模态大语言模型(MLLM)强化学习(RL)训练中的效率问题,提出了一个名为Shuffle-R1的框架。研究发现,当前RL训练存在两个关键缺陷: 优势值坍缩(Advantage Collapsing):批次中大多数优势值集中在零附近,导致有效梯度信号被淹…

阅读更多 →
PRvL: Quantifying the Capabilities and Risks of Large Language Models for PII Redaction 2026/11/13 16:11:45

PRvL: Quantifying the Capabilities and Risks of Large Language Models for PII Redaction

一、文章主要内容总结 本文聚焦于利用大型语言模型(LLMs)实现个人身份信息(PII)脱敏的研究,旨在解决传统脱敏方法(如基于规则的系统、领域特定命名实体识别(NER)模型)泛化能力差、跨格式/跨语境适应性弱的问题。 研究通过全面评估多种LLM架构(包括密集型LLM(D-LLM…

阅读更多 →
LLaVA-RE: Binary Image-Text Relevancy Evaluation with Multimodal Large Language Model 2026/11/14 3:51:43

LLaVA-RE: Binary Image-Text Relevancy Evaluation with Multimodal Large Language Model

文章主要内容和创新点 主要内容 本文聚焦于二进制图像-文本相关性评估任务(判断图像与文本“相关”或“不相关”),针对该任务中文本格式多样、相关性定义随场景变化等挑战,提出了基于多模态大语言模型(MLLM)的解决方案LLaVA-RE。 模型设计:LLaVA-RE基于LLaVA 1.5架构,…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉