python实现的文本差异比对工具

18 阅读5分钟

文本差异比对工具 (Text Difference Tool)

这是一个使用 Python Tkinter 和 difflib 模块构建的图形化文本内容差异比对工具。它允许用户输入或加载两段文本,高亮显示它们之间的差异,并提供了交互式合并差异的功能。

功能特性

  • 双文本输入框: 提供两个独立的滚动文本区域,用于输入或粘贴待比较的文本。
  • 文件加载:
    • 可以通过菜单栏从本地文件系统加载文本到任一输入框中。
    • 每个文本输入框上方均有独立的 "选择文件" 按钮,方便快速加载,支持所有文件类型。
  • 差异高亮 (输入框内):
    • 删除的行 (文本1): 在文本1中存在但在文本2中不存在的行,以浅红色背景高亮显示。
    • 新增的行 (文本2): 在文本2中存在但在文本1中不存在的行,以浅绿色背景高亮显示。
    • 替换的行:
      • 文本1中被替换的部分以浅橙色背景高亮。
      • 文本2中替换后的部分以浅青色背景高亮。
  • 差异高亮 (结果区):
    • 新增行: 在文本2中新增的行,以绿色背景高亮显示 (标记为 + )。
    • 删除行: 在文本1中被删除的行,以红色背景高亮显示 (标记为 - )。
    • 行内差异提示: difflib.ndiff 生成的行内差异指示行,以蓝色前景显示 (标记为 ? )。
    • 相同行: 两个文本中相同的行,以默认文本颜色显示 (标记为 )。
  • 交互式差异导航与合并:
    • 导航按钮: "< 上一处" 和 "下一处 >" 按钮用于在差异块之间跳转。
    • 当前差异高亮: 当前选中的差异块在两个输入文本框中会以边框突出显示。
    • 应用差异按钮:
      • "⬅️ 应用到左侧": 将右侧文本2中当前选中差异块的内容应用到左侧文本1。
      • "应用到右侧 ➡️": 将左侧文本1中当前选中差异块的内容应用到右侧文本2。
    • 应用差异后,文本会自动重新比对。
  • 保存功能:
    • "保存文本1" 和 "保存文本2" 按钮允许用户将对应文本框的内容保存到本地文件。
  • 结果显示: 在一个单独的滚动文本区域清晰地展示 ndiff 格式的比对结果。
  • 一键比对: 通过点击 "比对差异" 按钮执行比较操作。
  • 清空功能: 快速清空所有文本框内容。
  • 关于信息: 显示工具的版本和基本信息。
  • 界面语言: 主要按钮和标签使用中文。
  • 跨平台: 由于使用 Tkinter,理论上可以在支持 Python 和 Tkinter 的多平台上运行。

运行与使用

依赖

  • Python 3.x
  • Tkinter (通常随 Python 标准库一同安装)
  • difflib (Python 标准库)

直接运行 Python 脚本

  1. 将代码保存为 .py 文件 (例如 text_diff_gui.py)。
  2. 打开终端或命令行。
  3. 导航到脚本所在的目录。
  4. 执行以下命令:
    python text_diff_gui.py
    

打包成可执行文件 (EXE) - 使用 PyInstaller

如果你希望创建一个独立的可执行文件 (例如在 Windows 上的 .exe),可以使用 PyInstaller。

  1. 安装 PyInstaller (如果尚未安装):

    pip install pyinstaller
    
  2. 打包命令: 在终端或命令行中,导航到你的 .py 文件所在的目录,然后运行:

    pyinstaller --name TextDiffTool --onefile --windowed text_diff_gui.py
    
    • --name TextDiffTool: 指定输出的 EXE 文件名 (以及相关文件夹名)。
    • --onefile: 将所有依赖打包进一个单独的 EXE 文件。
    • --windowed: 创建一个窗口化应用 (运行时不显示命令行控制台)。
    • text_diff_gui.py: 你的 Python 脚本文件名。
  3. 找到 EXE 文件: 打包完成后,你会在当前目录下生成一个 dist 文件夹,其中包含了 TextDiffTool.exe 文件。

界面概览

程序界面主要分为几个部分:

  1. 顶部 - 文本输入区:
    • 左侧为 "文本1" 输入区,上方有 "选择文件" 按钮。
    • 右侧为 "文本2" 输入区,上方有 "选择文件" 按钮。
  2. 中部 - 操作控制区:
    • "比对差异" 按钮。
    • 差异导航与应用按钮组: "< 上一处", "⬅️ 应用到左侧", "应用到右侧 ➡️", "下一处 >"。
  3. 保存按钮区:
    • "保存文本1" 和 "保存文本2" 按钮。
  4. 底部 - 差异结果区 (ndiff 格式):
    • 显示 ndiff 格式的比对后的差异详情。

菜单栏提供 "文件 (File)" (加载、清空、退出) 和 "帮助 (Help)" (关于) 选项。

创作过程简述

  1. 需求分析: 需要一个能够直观比较两段文本差异,并支持交互式合并的工具。
  2. 技术选型:
    • GUI: Python 内置的 Tkinter 库。
    • 差异比较: Python 内置的 difflib 模块,主要使用 SequenceMatcher (用于输入框内高亮和交互式合并) 和 ndiff (用于传统结果区显示)。
  3. 界面布局:
    • 使用 tk.Frame 进行模块化布局。
    • 使用 gridpack 布局管理器。
  4. 核心逻辑:
    • 比对 (compare_texts):
      • 使用 SequenceMatcher 获取操作码 (opcodes),用于识别差异块。
      • 根据操作码在两个输入文本框内直接高亮差异行(删除、插入、替换)。
      • 存储可操作的差异块信息,用于导航和应用。
      • 使用 ndiff 生成传统差异视图在底部结果区显示。
    • 差异导航 (next_diff, prev_diff):
      • 在可操作的差异块之间切换。
      • 高亮当前选中的差异块。
    • 差异应用 (apply_to_left, apply_to_right):
      • 根据当前选中的差异块和操作类型(删除、插入、替换),修改对应文本框的内容。
      • 修改后自动重新比对。
  5. 辅助功能:
    • 文件加载 (load_file),包括文本框上方的专用按钮和菜单项。
    • 文本保存 (save_text_area)。
    • 清空 (clear_all_texts)。
    • 菜单栏和关于对话框。
  6. 细节完善:
    • 状态管理,如当前选中的差异、按钮的启用/禁用状态。
    • 确保文本框在修改内容后能正确重新比对和更新高亮。
    • 界面文本主要使用中文。

该工具旨在提供一个功能相对完善且易用的界面来完成文本比对和合并任务。

1.png