如何在 Python 中逐行比较两个不同的文件?


本教程介绍了用于比较两个文件的各种 Python 比较技术。我们将介绍如何使用可用的模块、读取两个文件并逐行比较它们来执行此典型工作。

在 Python 中,比较两个文件可以通过多种方式完成。

逐行比较两个文本文件

使用 open() 函数读取两个文本文件中的数据,我们可以比较它们包含的信息。open() 函数将搜索本地目录并可能读取。

示例

在这个示例中,我们将对比两个包含 python 数据的文件。我们被告知这两个 python 文件可能不相同。Python 将为我们检查文件。可以使用 readlines() 方法从 python 文件中提取行。

file1 = open('D:\Work TP/moving files.py', 'r') file2 = open('D:\Work TP/mysql_access.py', 'r') File3 = open('D:\Work TP/trial.py', 'w') for line1 in file1: for line2 in file2: if line1 == line2: File3.write("%s\n" %(line1)) File3.close() file1.close() file2.close()

提取数据后,使用 for 循环逐行比较文件。如果行不匹配,则通过消息通知用户发生不匹配的位置。为了方便用户找到不同的行,我们将包含数据本身。

输出

以下是上述代码的输出 -

Line 1 doesn't match.
------------------------
File1: # importing the modules

File2: import mysql.connector

Line 2 doesn't match.
------------------------
File1: import os

File2: sampleDB=mysql.connector.connect(host='localhost',user='root',password='password',database='textx')

Line 3 doesn't match.
------------------------
File1: import shutil

File2: #print (sampleDB.connection_id)

Line 4 doesn't match.
------------------------
File1: # Providing the folder path

File2: cur=sampleDB.cursor()

Line 5 doesn't match.
------------------------
File1: origin = 'C:\Users\Lenovo\Downloads\Works\'

File2: s="CREATE TABLE novel(novelid integer(4),name varchar(20),price float(5,2))"

Line 6 doesn't match.
------------------------
File1: target = 'C:\Users\Lenovo\Downloads\Work TP\'

File2: cur.execute(s)

使用 filecmp 模块

filecmp 模块使在 Python 中处理文件成为可能。此模块专门用于比较两个或多个文件之间的数据。我们可以使用 filecmp.cmp() 方法来实现这一点。如果文件匹配,此函数将返回 True;否则,将返回 False。

示例

以下是使用 filecmpule 的示例 

import filecmp import os # notice the two backslashes File1 = "D:\Work TP\moving files.py" File2 = "D:\Work TP\trial.py" def compare_files(File1,File2): compare = filecmp.cmp(File1,File2) if compare == True: print("The two files are the same.") else: print("The two files are different.") compare_files(File1,File2)

输出

以下是上述代码的输出 -

The two files are different.

使用 difflib 模块

要比较文本并识别它们之间的差异,请使用 difflib 包。此 Python 3 模块已预先打包在语言中。它具有许多用于比较文本样本的有用功能。

首先,我们将使用 unified diff() 函数识别两个数据文件之间的差异。接下来,我们将比较这些文件。

示例 1 - 使用 unified-diff()

在下面的示例中,使用 with 语句读取文件数据。Python with 语句允许我们安全地打开和读取文件 -

import difflib with open("D:\Work TP/moving files.py",'r') as file1: file1_info = file1.readlines() with open("D:\Work TP/trial.py",'r') as file2: file2_info = file2.readlines() diff = difflib.unified_diff( file1_info, file2_info, fromfile="file1.py", tofile="file2.py", lineterm='') for lines in diff: print(lines)

输出

以下是上述代码的输出 -

--- file1.py
+++ file2.py
@@ -1,12 +0,0 @@

-# importing the modules

-import os

-import shutil

-# Providing the folder path

-origin = 'C:\Users\Lenovo\Downloads\Works\'

-target = 'C:\Users\Lenovo\Downloads\Work TP\'

-# Fetching the list of all the files

-files = os.listdir(origin)

-# Fetching all the files to directory

-for file_name in files:

- shutil.copy2(origin+file_name, target+file_name)

-print("Files are copied succesfully")

示例 2 - 使用 differ()

在 difflib 库中,有一个名为 Differ 的类,可用于比较文件差异。此类用于比较文本行组并生成增量或差异。

以下是一个使用 differ() 方法逐行比较两个不同文件的示例 -

from difflib import Differ with open('D:\Work TP/moving files.py') as file1, open('D:\Work TP/trial.py') as file2: vary = Differ() for lines in vary.compare(file1.readlines(), file2.readlines()): print(lines)

输出

以下是上述代码的输出 -

- # importing the modules

- import os

- import shutil

- # Providing the folder path

- origin = 'C:\Users\Lenovo\Downloads\Works\'

- target = 'C:\Users\Lenovo\Downloads\Work TP\'

- # Fetching the list of all the files

- files = os.listdir(origin)

- # Fetching all the files to directory

- for file_name in files:

- shutil.copy2(origin+file_name, target+file_name)

- print("Files are copied succesfully")

更新于: 2022年8月17日

11K+ 浏览量

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告