gpt4 book ai didi

python - 使用 csv.DictReader 逐行比较两个 .csv 文件中的两列

转载 作者:行者123 更新时间:2023-12-01 07:19:53 25 4
gpt4 key购买 nike

我有两个大型 .csv 文件,我想使用 csv DictReader 或什至 pandas 逐行比较两列。

我需要检查两个文件中特定列的所有行是否相同。我在这里看到了一些建议,但没有一个适合我的情况。问题是第二个打开的文件的迭代顺序不正确,即使文件相同。

我已经使用 openpyxl 非常快速地完成了搜索和修改任务,但由于 csv 文件大小为数百 MB,因此即使在运行时将 csv 转换为 excel 似乎也不是一个好的决定.

这是我现在所拥有的代码:

import csv

class CsvCompareTester:

work_csv_path = None
test_csv_path = None

@staticmethod
def insert_file_paths():
print()
print('Enter the full absolute path of the WORK .csv file:')
CsvCompareTester.work_csv_path = input()

print('Enter the full absolute path of the TEST .csv file:')
CsvCompareTester.test_csv_path = input()

@staticmethod
def compare_files(work_csv_file, test_csv_file):

work_csv_obj = csv.DictReader(work_csv_file, delimiter=";")
test_csv_obj = csv.DictReader(test_csv_file, delimiter=";")

for work_row in work_csv_obj:
for test_row in test_csv_obj:
if work_row == test_row:
print('ALL CLEAR')
print(str(work_row))
print(str(test_row))
print()
else:
print("STRINGS DON'T MATCH")
print(str(work_row))
print(str(test_row))
print()


if __name__ == "__main__":
csv_tester = CsvCompareTester()
csv_tester.insert_file_paths()

with open(CsvCompareTester.work_csv_path) as work_file:
with open(CsvCompareTester.test_csv_path) as test_file:
csv_tester.compare_files(work_file, test_file)

如何迭代 .csv 文件行,同时还能够按键或值寻址特定的行和列(这绝对可以减少无用的迭代量)。由于某种原因,在上面的代码中,第一个文件中的每个行字符串与第二个文件中的每个行字符串都不匹配。文件是相同的并且具有相同的条目顺序,我已经仔细检查过。为什么第二个文件没有像第一个文件一样从头到尾迭代?

最佳答案

问题在于您如何循环文件。按照您的方式,会尝试将第一个文件的每一行与第二个文件的每一行进行比较。相反,您需要以锁步方式获取它们的行 - 一个好的方法是使用内置 zip()功能。

所以这样做:

    @staticmethod
def compare_files(work_csv_file, test_csv_file):

work_csv_obj = csv.DictReader(work_csv_file, delimiter=";")
test_csv_obj = csv.DictReader(test_csv_file, delimiter=";")

# for work_row in work_csv_obj:
# for test_row in test_csv_obj:

for work_row, test_row in zip(work_csv_obj, test_csv_obj):
if work_row == test_row:
print('ALL CLEAR')
print(str(work_row))
print(str(test_row))
print()
else:
print("STRINGS DON'T MATCH")
print(str(work_row))
print(str(test_row))
print()

顺便说一句,即使它可能还没有引起任何问题,我也注意到您没有正确打开这两个文件,如 csv.DictReader 中所示。文档 - 您遗漏了 newline='' 参数。

这是执行此操作的正确方法:

if __name__ == "__main__":
csv_tester = CsvCompareTester()
csv_tester.insert_file_paths()

# with open(CsvCompareTester.work_csv_path) as work_file:
# with open(CsvCompareTester.test_csv_path) as test_file:

with open(CsvCompareTester.work_csv_path, newline='') as work_file:
with open(CsvCompareTester.test_csv_path, newline='') as test_file:
csv_tester.compare_files(work_file, test_file)

关于python - 使用 csv.DictReader 逐行比较两个 .csv 文件中的两列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57759807/

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