如何在 Python 中查找两个文件之间的差异?

2025年1月4日 | 阅读7分钟

在处理文件时,我们经常需要识别两个文件之间的差异。Python 提供了许多强大的工具来帮助我们快速准确地完成此操作。在接下来的教程中,我们将介绍在 Python 中查找两个文件之间差异的不同方法。由于每种方法都有其独特的特性和灵活性,我们可以轻松地比较不同大小和格式的文件。我们将通过示例讨论每种方法。在本教程结束时,我们将对如何准确、自信地执行文件比较有足够的了解。现在,让我们开始这段 Python 文件差异探索之旅。

认识 Python 文件比较的重要性

在深入实际操作之前,了解 Python 中文件比较的目标非常重要。通过比较两个文件,我们可以识别更改、相似之处和差异。这种做法对于数据验证、版本控制以及识别配置文件中的修改至关重要。

查找两个文件之间差异的不同方法

查找两个文件之间差异有几种方法。其中一些方法列在下面:

  1. 使用 filecmp 模块
  2. 使用 difflib 模块
  3. 使用 hashlib 模块
  4. 使用 fileinput 模块
  5. 使用 difflib.HtmlDiff 类

现在让我们通过示例讨论这些方法。

使用 filecmp 模块

我们的第一种方法演示了使用 filecmp 模块进行文件比较,该模块以其高效和简单的功能而闻名。

示例

输出

 
These Files are not Same.   

说明

在此 Python 脚本中,使用 filecmp 模块比较了名为 'FirstFile.txt' 和 'SecondFile.txt' 的两个文件,以查看它们是否相同。尽管您可能认为文件是相同的,但结果有时会显示相反的情况。如果文件的编码、布局或内容存在差异,这种差异可能导致误报。通过进一步研究文件的格式和内容,可以更清楚地了解差异的根本原因。

在此示例中,调用了 filecmp 模块,这是一个著名的文件比较功能集合。fileOne 和 fileTwo 变量分别提供 FirstFile.txt 和 SecondFile.txt 的路径信息。然后,filecmp.cmp() 方法会比较这两个文件的内容。如果文件相同,则该方法返回 True;否则,返回 False。在控制台中显示比较结果非常方便。

使用 difflib 模块

我们的第二个示例使用 difflib 模块,该模块具有用于比较文件和序列的多种实用程序,来描述文件比较。

示例

输出

 
--- FirstFile.txt

+++ SecondFile.txt

@@ -1,8 +1,8 @@

-Example File - One

-This is a sample file.

-This file is specially designed for Javatpoint

-This file will greet you.

-This is my file.

-This is the text file that I have written.

-I am writing this content because I think this is good.

-You should understand this.
+Example File - Two

+This is another sample file.

+This second file is specially designed for Javatpoint

+This second file will give you candy.

+This is your file.

+This is the text file that you have written.

+You are writing this content because You think this is good.

+I should understand this.   

说明

我们在此处加载 difflib 模块以比较序列,包括文本文件中的行。我们调用 open() 方法,该方法从两个文件中读取数据,并将它们存储在两个不同的变量 f1 和 f2 中。当调用 difflib.unified_diff() 函数时,会显示文件之间的差异。可以使用 fromfile 和 tofile 选项在输出中指定文件名。我们可以有效地确定差异,并在控制台上显示它们。

我们在此处加载 difflib 模块以比较序列,包括文本文件中的行。我们调用 open() 方法,该方法从两个文件中读取数据,并将它们存储在两个不同的变量 f1 和 f2 中。当调用 difflib.unified_diff() 函数时,会显示文件之间的差异。可以使用 fromfile 和 tofile 选项在输出中指定文件名。我们可以有效地确定差异,并在控制台上显示它们。

使用 hashlib 模块

第三种方法通过 hashlib 模块(SHA-1 哈希值的先驱)教授文件比较的技术。

示例

输出

 
These Files are not Same.   

说明

使用一个名为 fileHash() 的自定义函数,附带的 Python 脚本会计算两个文件 "fileOne" 和 "fileTwo" 的 SHA-1 哈希值。然后比较哈希值以确定文件是否相同。尽管预计文件是相同的,但结果有时会显示它们并非如此。这可能是因为文件的编码、格式或内容存在差异,导致文件的哈希值不同。通过进一步研究文件的格式和内容,可以更清楚地了解差异的根本原因。

在此示例中,hashlib 模块提供了加密哈希函数。fileHash() 方法继续接收文件名并返回其 SHA-1 哈希值。在二进制模式下读取文件时,数据块会逐步添加到哈希对象中。使用 == 运算符,我们比较两个文件的哈希值;结果显示在控制台上。

使用 fileinput 模块

我们下一个示例中演示的文件比较用例利用 fileinput 模块来简化对多个文件的处理。

示例

输出

 
FileOne: Example File - One
FileTwo: Example File - Two

FileOne: This is a sample file.
FileTwo: This is another sample file.

FileOne: This file is specially designed for Javatpoint
FileTwo: This second file is specially designed for Javatpoint

FileOne: This file will greet you.
FileTwo: This second file will give you candy.

FileOne: This is my file.
FileTwo: This is your file.

FileOne: This is the text file that I have written.
FileTwo: This is the text file that you have written.

FileOne: I am writing this content because I think this is good.
FileTwo: You are writing this content because You think this is good.

FileOne: You should understand this.
FileTwo: I should understand this.   

说明

在此示例中,fileinput 模块可以帮助简化逐行读取多个文件的过程。zip() 方法同步迭代两个文件中的相应行。如果检测到行之间的差异,我们将两个文件的行重定向到终端。strip() 函数确保从行中删除任何多余的前导或尾随空格字符。

使用 difflib.HtmlDiff 类

在最后两个示例中,我们使用 difflib 来比较文件。HtmlDiff 类会生成格式为 HTML 的差异。

示例

输出

How to Find the Difference Between Two Files in Python?

说明

在此示例中,difflib 模块再次发挥作用,我们使用 HtmlDiff 类来提供一种以 HTML 格式呈现的比较。使用 open() 方法,调用两个文件的内容,并将它们分配给不同的变量 f1 和 f2。主要函数是 difflib.HtmlDiff().make_file(),它使用 fromdesc 和 todesc 参数提供文件描述,并将文件差异定义为 HTML。会生成一个 HTML 比较,并将其保存到名为 "comp.html" 的文件中。

结论

总而言之,对于从事文件处理和数据验证的任何开发人员来说,了解如何在 Python 中比较两个文件都很有用。在本文中,我们研究了多种不同的情况来确定文件之间的差异,每种情况都拥有独特的优势和功能。

无论是通过 difflib 创建 HTML 格式的差异,还是使用 filecmp、hashlib、fileinput、difflib 模块和 HtmlDiff 类,每种技术都能让您轻松地比较文件并准确无误地识别差异。

在继续学习 Python 的过程中,请利用您新开发的��件比较能力来加速文件处理、版本控制和数据验证。我希望这些文件比较方法在您创建可靠高效的文件管理应用程序时,能帮助您成为一名更熟练的 Python 程序员。