目录[-]

使用python的内置库difflib为核心,实现两个文本进行对比并生成HTML网页,为方便使用,使用内置库tkinter制作简单的界面,效果如下:

difflib1

difflib2

#作者:冯桂和
#功能:将输入的两个文本进行对比,查看增删改部分

import tkinter as tk
from tkinter import *
from tkinter import messagebox
import  difflib

#创建主窗口
win=tk.Tk()
#设置窗口标题
win.title("文本对比工具")
#设置窗口大小
win.geometry('1170x650+300+200')

#创建两个文本控件
text1=tk.Text(win,width=80,height=40)
text2=tk.Text(win,width=80,height=40)
text1.grid(row=1,column=0,padx=5,pady=5)
text2.grid(row=1,column=1,padx=5,pady=5)

#添加四个按钮函数
t1=''   #全局变量存储内容1
t2=''   #全局变量存储内容2
def b1():
    global t1
    text1.delete('1.0', END)
    ctrlv=win.clipboard_get()
    text1.insert(END,ctrlv)
    t1=ctrlv
def b2():
    global t2
    text2.delete('1.0', END)
    ctrlv=win.clipboard_get()
    text2.insert(END,ctrlv)
    t2=ctrlv
def b3():
    global t1,t2
    t1=text1.get("1.0", "end")
    t2=text2.get("1.0", "end")
    len1=len(t1)-1
    len2=len(t2)-1
    show='内容1字符数:{}\n内容2字符数:{}'.format(len1,len2)
    messagebox.showinfo(title='运行提示', message=show)
def b4():
    global t1,t2
    t1=text1.get("1.0", "end")  #获取文本1
    t2=text2.get("1.0", "end")  #获取文本2
    t1=hh(t1)                   #过长换行
    t2=hh(t2)                   #过长换行
    t1=t1.splitlines(keepends=True)     #分割保留回车符
    t2=t2.splitlines(keepends=True)     #分割保留回车符
    d=difflib.HtmlDiff()                #创建对比对象
    result=d.make_file(t1,t2)           #生成对比内容
    result=result.replace('Added','新增')                 #替换网页内容
    result=result.replace('Changed',' 改变 ')   #替换网页内容
    result=result.replace('Deleted',' 删除 ')   #替换网页内容
    f=open('文本对比.html','w',encoding='utf-8')    #输出html文件
    f.write(result)
    f.close()
    messagebox.showinfo(title='运行提示', message='程序运行成功,已在同级目录下生成html文件')

#文本超过指定个字符增加\n函数
def hh(t):
    length=44
    ttt=t
    ttt=ttt.splitlines(keepends=True)
    for i in range(len(ttt)):
        j=0
        if len(ttt[i])>=length:             #超过length长度的段落进行操作
            j=int(len(ttt[i])/length)
        if j>1:
            for k in range(1,j+1):
                ttt[i]=list(ttt[i])             #段落转列表
                ttt[i].insert(length*k,'\n')    #列表插入换行符
                ttt[i]=''.join(ttt[i])          #列表转回字符串段落
    a="".join(ttt)
    return a

#创建四个按钮
Button1=tk.Button(win,text='粘贴内容1',width=45, height=1,bg='#D8D8D8',command=b1,font=('微软雅黑',15))
Button2=tk.Button(win,text='粘贴内容2',width=45, height=1,bg='#D8D8D8',command=b2,font=('微软雅黑',15))
Button3=tk.Button(win,text='文本统计',width=45, height=1,bg='#D8D8D8',command=b3,font=('微软雅黑',15))
Button4=tk.Button(win,text='文本对比',width=45, height=1,bg='#C6E3FC',command=b4,font=('微软雅黑',15))
Button1.grid(row=2,column=0,padx=5,pady=5)
Button2.grid(row=2,column=1,padx=5,pady=5)
Button3.grid(row=3,column=0,padx=5,pady=5)
Button4.grid(row=3,column=1,padx=5,pady=5)

#显示主窗口
win.mainloop()