gpt4 book ai didi

python - 如何使用 Python 的 difflib 生成类似于 Unix sdiff 命令的两个文件的并排比较?

转载 作者:太空狗 更新时间:2023-10-30 00:20:01 26 4
gpt4 key购买 nike

我使用的是 Python 2.6,我想创建一个简单的 GUI,其中包含两个并排的文本 Pane ,用于比较两个文本文件 (file1.txt 和 file2.txt)。

我正在使用 difflib但我不清楚如何产生类似于 sdiff 的结果Unix 命令。

为了重现并排比较,我需要 difflib例如,返回两个变量 file1_difffile2_diff

我也考虑过使用sdiff直接输出并解析它以分隔 Pane ,但结果并不像看起来那么容易......有什么提示吗?

最佳答案

您可以使用 difflib.Differ返回单个行序列,每行的开头都有一个标记来描述该行。这些标记告诉您有关该行的以下信息:

<表类="s-表"><头>标记描述<正文> '- ' 文件 1 独有的行 '+ ' 文件 2 独有的行 ' ' 两个文件共有的行 '? ' 行不存在于两个输入文件中

您可以使用此信息来决定如何显示数据。例如,如果标记是 , 你把这条线放在左边和右边的小部件里。如果是 + , 你可以在左边放一个空白行,在右边放一个实际的行,表明该行对右边的文本是唯一的。同样,- 表示该行在左侧是唯一的。

例如,您可以创建两个文本小部件 t1t2 ,一左一右。您可以通过为每个文件创建行列表然后将它们传递给 compare 来比较两个文件。 differ 方法,然后迭代结果。

t1 = tk.Text(...)
t2 = tk.Text(...)

f1 = open("file1.txt", "r").readlines()
f2 = open("file2.txt", "r").readlines()

differ = difflib.Differ()
for line in differ.compare(f1, f2):
marker = line[0]
if marker == " ":
# line is same in both
t1.insert("end", line[2:])
t2.insert("end", line[2:])

elif marker == "-":
# line is only on the left
t1.insert("end", line[2:])
t2.insert("end", "\n")

elif marker == "+":
# line is only on the right
t1.insert("end", "\n")
t2.insert("end", line[2:])

上面的代码忽略了带有标记 ? 的行因为这些是额外的行,试图引起对前一行中不同字符的注意,并且实际上不属于任何一个文件。如果愿意,您可以使用该信息来突出显示各个字符。

关于python - 如何使用 Python 的 difflib 生成类似于 Unix sdiff 命令的两个文件的并排比较?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31022893/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com