基于Python編寫一個簡單的文本對比工具
在日常工作里,經(jīng)常會遇到這樣的需求:有一份標準文本,還有一份需要檢查的文本,希望快速找出哪里寫錯了、哪里多了、哪里少了。
這個小工具就是為這個場景準備的。它使用 Python 讀取兩份 .txt 文本文件,逐行對比內(nèi)容,并把差異標注到一個新的結(jié)果文件中。
工具文件說明
這個工具文件夾里主要有 4 個文件:
文本對比樣本.txt 需要對比的文本.txt 標注出來的錯誤文本.txt 對比文檔腳本.py
各文件作用如下:
| 文件名 | 作用 |
|---|---|
文本對比樣本.txt | 放標準文本,也就是正確版本 |
需要對比的文本.txt | 放需要檢查的文本 |
標注出來的錯誤文本.txt | 保存腳本生成的對比結(jié)果 |
對比文檔腳本.py | Python 腳本,負責讀取、比較、輸出 |
日常使用時,只需要修改前兩個 .txt 文件,然后運行 Python 腳本即可。
使用方法
先把標準內(nèi)容粘貼到:文本對比樣本.txt
再把需要檢查的內(nèi)容粘貼到:需要對比的文本.txt
保存文件后,在終端進入工具所在文件夾,執(zhí)行:
python3 對比文檔腳本.py
如果是 Windows 電腦,可能需要使用:
py -3 對比文檔腳本.py
或者:
python 對比文檔腳本.py
運行完成后,打開:標注出來的錯誤文本.txt
就能看到生成的對比結(jié)果。
輸出結(jié)果示例
如果某一處文字寫錯了,結(jié)果中會出現(xiàn):
【錯誤:錯字|應為:正確字】
如果多寫了內(nèi)容,會出現(xiàn):
【多余:某些文字】
如果少寫了內(nèi)容,會出現(xiàn):
【缺少:某些文字】
如果兩份文本完全一致,則會顯示:
未發(fā)現(xiàn)差異。
腳本整體思路
這個 Python 腳本的處理流程可以分成 5 步:
- 確定默認文件路徑
- 讀取標準文本和待檢查文本
- 按行拆分兩份文本
- 逐行比較差異
- 把標注結(jié)果寫入輸出文件
核心邏輯并不復雜,但它用到了幾個很實用的 Python 標準庫。
Python 知識點 1:pathlib處理文件路徑
腳本中使用了:
from pathlib import Path
Path 是 Python 里處理文件路徑的現(xiàn)代寫法,比直接拼接字符串更清晰。
例如:
BASE_DIR = Path(__file__).resolve().parent DEFAULT_SAMPLE_FILE = BASE_DIR / "文本對比樣本.txt"
這里的意思是:
__file__表示當前腳本文件resolve()獲取腳本的完整路徑parent獲取腳本所在文件夾/可以用來拼接路徑
這樣寫的好處是:無論用戶從哪里運行腳本,它都能找到腳本同目錄下的文本文件。
Python 知識點 2:讀取和寫入文本文件
讀取文件使用:
path.read_text(encoding="utf-8-sig")
寫入文件使用:
output_file.write_text(report, encoding="utf-8")
這里指定了編碼:
utf-8是常見的通用文本編碼utf-8-sig可以兼容帶 BOM 的 UTF-8 文件
這對中文文本很重要。如果編碼處理不好,中文可能會亂碼。
Python 知識點 3:異常檢查
腳本中有一個讀取文本的函數(shù):
def read_text(path: Path) -> str:
if not path.exists():
raise FileNotFoundError(f"找不到文件:{path}")
return path.read_text(encoding="utf-8-sig")
這里先判斷文件是否存在:
if not path.exists():
如果文件不存在,就主動拋出錯誤:
raise FileNotFoundError(...)
這樣比靜默失敗更好,因為用戶可以馬上知道是哪個文件缺失。
Python 知識點 4:函數(shù)拆分
腳本沒有把所有代碼都寫在一起,而是拆成了多個函數(shù):
read_text() split_lines() mark_line_diff() compare_texts() build_report() parse_args() main()
這種寫法的好處是:
- 每個函數(shù)只負責一件事
- 代碼更容易閱讀
- 后續(xù)修改更方便
- 出問題時更容易定位
比如 compare_texts() 只負責比較文本,build_report() 只負責生成報告內(nèi)容。
Python 知識點 5:dataclass保存結(jié)構(gòu)化數(shù)據(jù)
腳本中定義了一個數(shù)據(jù)類:
@dataclass
class LineDiff:
line_no: int
sample_line: str
target_line: str
marked_target: str
notes: list[str]
dataclass 適合用來保存一組相關數(shù)據(jù)。
這里每一處差異都包含:
- 第幾行
- 標準文本內(nèi)容
- 待檢查文本內(nèi)容
- 標注后的內(nèi)容
- 差異說明
相比用普通字典,dataclass 的字段更清楚,代碼也更容易維護。
Python 知識點 6:difflib比較字符串差異
腳本中最關鍵的比較功能來自 Python 標準庫:
import difflib
核心代碼是:
matcher = difflib.SequenceMatcher(a=sample_line, b=target_line)
SequenceMatcher 可以比較兩個字符串,并告訴我們哪些部分相同、哪些部分不同。
它返回的差異類型主要有:
| 類型 | 含義 |
|---|---|
equal | 兩邊內(nèi)容相同 |
replace | 內(nèi)容被替換了 |
delete | 目標文本里缺少內(nèi)容 |
insert | 目標文本里多出內(nèi)容 |
腳本根據(jù)這些類型生成不同的標注。
例如:
elif tag == "replace":
marked_parts.append(f"【錯誤:{actual}|應為:{expected}】")
這表示如果發(fā)現(xiàn)替換錯誤,就把錯誤內(nèi)容和正確內(nèi)容一起寫進結(jié)果文件。
Python 知識點 7:命令行參數(shù)
腳本使用了:
import argparse
argparse 可以讓腳本支持命令行參數(shù)。
比如默認運行:
python3 對比文檔腳本.py
會覆蓋舊結(jié)果。
如果想保留歷史結(jié)果,可以運行:
python3 對比文檔腳本.py --append
這個 --append 參數(shù)就是通過 argparse 實現(xiàn)的。
腳本中對應代碼是:
parser.add_argument(
"--append",
action="store_true",
help="追加到輸出文件末尾;默認覆蓋輸出文件,便于每次粘貼后得到最新結(jié)果",
)
action="store_true" 的意思是:只要用戶寫了 --append,這個值就變成 True。
Python 知識點 8:程序入口
腳本最后有這樣一段:
if __name__ == "__main__":
main()
這是 Python 腳本里非常常見的寫法。
它的意思是:當這個文件被直接運行時,執(zhí)行 main() 函數(shù)。
這樣做的好處是,如果以后這個文件被其他 Python 文件導入,里面的函數(shù)可以被復用,但不會自動執(zhí)行完整流程。
為什么這個腳本不需要安裝額外依賴
這個工具用到的庫包括:
- argparse
- difflib
- dataclasses
- datetime
- pathlib
這些都是 Python 自帶的標準庫。
也就是說,只要電腦上安裝了 Python 3,一般就可以運行,不需要再安裝第三方庫。
Windows 用戶需要注意,安裝 Python 時建議勾選:
Add python.exe to PATH
否則可能會出現(xiàn)終端找不到 python 命令的問題。
常見問題
1. 為什么運行后看起來沒反應?
這個腳本不會彈出窗口,它只會在終端輸出提示,并把結(jié)果寫入:
標注出來的錯誤文本.txt
所以運行后需要打開這個文件查看結(jié)果。
2. 為什么 Windows 上python3不能用?
Windows 上常見命令是:
python 對比文檔腳本.py
或者:
py -3 對比文檔腳本.py
python3 在 macOS 和 Linux 上更常見,Windows 上不一定默認支持。
3. 為什么提示找不到文件?
通常是因為幾個 .txt 文件沒有和腳本放在同一個文件夾里。
請確認這些文件都在一起:
文本對比樣本.txt
需要對比的文本.txt
標注出來的錯誤文本.txt
對比文檔腳本.py
4. 為什么結(jié)果看起來對不上?
這個工具是按行比較的。
如果兩份文本的換行位置差很多,結(jié)果可能不夠直觀。
建議把兩份文本按相同段落、相同行粘貼,這樣對比結(jié)果會更清楚。
總結(jié)
這個文本對比工具是一個很適合入門學習的 Python 小項目。
它覆蓋了文件讀寫、路徑處理、字符串比較、命令行參數(shù)、函數(shù)拆分、數(shù)據(jù)類等常見知識點,同時也能解決實際工作中的文本校對問題。
從這個腳本可以看到,Python 不一定要寫得很復雜,使用標準庫就能快速做出實用的小工具。
到此這篇關于基于Python編寫一個簡單的文本對比工具的文章就介紹到這了,更多相關Python文本對比工具內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
python3.9和pycharm的安裝教程并創(chuàng)建簡單項目的步驟
這篇文章主要介紹了python3.9和pycharm的安裝教程并創(chuàng)建簡單項目的步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-02-02
Pytorch使用CUDA流(CUDA?stream)的實現(xiàn)

