Python 比较两个 CSV 文件并打印差异
本文将讨论比较两个 CSV 文件的各种方法。 我们将包括执行此操作的最“Pythonic”方式和可帮助简化此任务的外部 Python 模块。
最后,我们将包括一种使用 Pandas DataFrames 识别 CSV 文件差异的方法。
我们假设需要比较的两个 CSV 文件的标题为 file1.csv 和 file2.csv。 您可以根据需要重命名文件。
还请在下面给出的代码片段中适当地替换文件名。
出于示例目的,我们的文件设置如下:
file1.csv:
1,2,3,4,5,6
4,5,6,7,8,9
1,3,4,5,6,1
file2.csv:
1,2,3,4,5,6
4,5,6,7,8,9
2,3,1,4,1,5
方法 1:使用最 Pythonic 的解决方案比较两个 CSV 文件
在这个方法中,我们将文件的内容读入两个列表,遍历其中一个列表并检查每一行是否存在于第二个列表中。 从逻辑上讲,这是一个非常简单的解决方案。
Python 的潜在效率使这种比较相当有效,尽管它看起来像。
with open('file1.csv', 'r') as file1, open('file2.csv', 'r') as file2:
f1_contents = file1.readlines()
f2_contents = file2.readlines()
for line in f1_contents:
if line not in f2_contents:
print(line)
for line in f2_contents:
if line not in f1_contents:
print(line)
上面的代码片段会将不同的行打印到您的终端。
在我们的测试用例中,我们得到以下输出。
1,3,4,5,6,1
2,3,1,4,1,5
方法 2:使用 csv-diff - 外部模块比较两个 CSV 文件
首先,在终端中使用以下命令安装模块。
python3 -m pip install csv-diff
安装后,您无需编写 Python 脚本。 您可以使用以下命令直接在终端中运行它。
csv-diff file1.csv file2.csv --key=id
运行此命令将在您的终端上显示差异。
在我们的测试用例中,我们得到以下输出。
1 row added, 1 row removed
1 row added
1: 2
2: 3
3: 1
4: 4
5: 1
6: 5
1 row removed
1: 1
2: 3
3: 4
4: 5
5: 6
6: 1
要将此模块用作 Python 脚本的一部分,您可以编写类似于以下内容的脚本。
from csv_diff import load_csv, compare
difference = compare(
load_csv(open("file1.csv")),
load_csv(open("file2.csv"))
)
print(difference)
输出如下。
{'added': [{'1': '2', '2': '3', '3': '1', '4': '4', '5': '1', '6': '5'}], 'removed': [{'1': '1', '2': '3', '3': '4', '4': '5', '5': '6', '6': '1'}], 'changed': [], 'columns_added': [], 'columns_removed': []}
方法 3:使用 Pandas DataFrames 比较两个 CSV 文件
以下脚本可以为您执行此任务。
import pandas as pd
import sys
import csv
def dataframe_difference(df1: pd.DataFrame, df2: pd.DataFrame, which=None):
comparison_df = df1.merge(
df2,
indicator=True,
how='outer'
)
if which is None:
diff_df = comparison_df[comparison_df['_merge'] != 'both']
else:
diff_df = comparison_df[comparison_df['_merge'] == which]
return diff_df
if __name__ == "__main__":
df1 = pd.read_csv("file1.csv", header=None)
df2 = pd.read_csv("file2.csv", header=None)
print(dataframe_difference(df1, df2))
请注意,在 read_csv 方法中,参数 header=None 被输入,因为我们的测试文件没有任何标题。 如果您的文件有标题,您可以使用以下方法读取它:pd.read_csv("file1.csv")
,其中 file1.csv 将被您的文件替换。
如果您的文件不在与脚本相同的目录中,请提供 CSV 文件的完整路径。
上面的 Python 脚本应该生成如下输出:
0 1 2 3 4 5 _merge
2 1 3 4 5 6 1 left_only
3 2 3 1 4 1 5 right_only
left_only 和 right_only 旁边的行包含所有差异。 _merge
旁边的行仅表示索引。
相关文章
Python 将 CSV 分割成多个文件
发布时间:2023/06/02 浏览次数:180 分类:Python
-
在本文中,我们将学习如何在 Python 中将一个 CSV 文件拆分为多个文件。 我们将使用 Pandas 创建一个 CSV 文件并将其拆分为其他多个文件。
将多个 CSV 文件导入 Pandas 并连接成一个 DataFrame
发布时间:2023/06/01 浏览次数:168 分类:Python
-
本篇文章介绍如何读取多个 .csv 文件并将所有 DataFrame 连接成一个。本篇文章将使用 Pandas 读取数据文件并创建和组合 DataFrame。
Python 中的 F-Test
发布时间:2023/06/01 浏览次数:113 分类:Python
-
本篇文章介绍 F 统计、F 分布以及如何使用 Python 对数据执行 F-Test 测试。方差(ANOVA) 分析中的 F 值
Python 套接字刷新
发布时间:2023/06/01 浏览次数:141 分类:Python
-
Python 套接字刷新 我们有没有想过如何在 Python 中刷新套接字?刷新套接字在网络应用程序中很常见,但大多数人需要帮助才能理解它是如何工作的。
Python 套接字 Accept 超时
发布时间:2023/06/01 浏览次数:138 分类:Python
-
本文讨论了 Python 中套接字的超时功能,该功能对于缓解无限期等待套接字接受的问题是必要的。套接字接受、拒绝和超时。Socket Accept:当socket打开成功,此时服务端和客户端已经建立连接,可
在 Python 中使用 OpenCV 的 imshow() 函数
发布时间:2023/06/01 浏览次数:80 分类:Python
-
本篇文章将介绍如何使用该库的 imshow() 函数。在 Python 中使用 OpenCV 库中的 imshow() 函数 cv2.imshow() 函数可以在新窗口中显示图像。 创建的窗口将自动调整以适合图像。
Python 中的 OpenCV-contrib 模块
发布时间:2023/06/01 浏览次数:192 分类:Python
-
Python 提供了一个名为 OpenCV 的标准库。 它有很多工具和功能来处理和实现不同的技术和算法。这个 OpenCV 库中有一个名为 OpenCV-contrib 的附加项。 我们将在本教程中讨论这个 OpenCV-contrib 模块及其
Python 中 OpenCV 阈值
发布时间:2023/06/01 浏览次数:199 分类:Python
-
本篇文章将解决在 Python 中使用 cv2.threshold() 函数的问题。阈值技术 阈值处理是一种对黑白图像进行的图像处理技术,可用于去除噪声和过滤具有极值的像素。
Python 中的 OpenCV Canny
发布时间:2023/06/01 浏览次数:184 分类:Python
-
本篇文章将介绍 Python 中的 cv2.canny() 函数。在 Python 中使用 cv2.canny() 函数 cv2.canny() 函数实现了由 John F. Canny 开发的 Canny 边缘检测算法。