我必须比较两个不同文件夹中的大型csv文件。这些文件以相同的名称存储在这些文件夹中。比较后,我需要打印的文件名,行号和字段是不同的。如果其中一个csv中缺少任何一行,那么我需要将其与filename、行号一起打印出来。
我有一个代码,它可以只打印不同的字段,但不能打印两个给定文件之间的行号。
import csv
import itertools
f1= open("file1.csv")
f2= open("file2.csv")
csv_f1= csv.reader(f1)
csv_f2= csv.reader(f2)
for row1, row2 in zip(csv_f1,csv_f2):
if row1 != row2:
print(set(row1)-set(row2))
请帮助将其扩展到文件夹级别,并打印文件名和行号以及导致差异的字段。我还需要打印缺少行的文件名和行号。
我尝试在csv.reader部件上使用line_num函数,但它返回的是其他结果,而不是行号。任何查找行号和差异的函数都会有很大的帮助。谢谢。
编辑:我按照@Adrian的要求发布了下面的查询和文件
import csv
import itertools
f1= open("D:/Users/KPriya4/Downloads/csv1.csv")
f2= open("D:/Users/KPriya4/Downloads/csv2.csv")
csv_f1= csv.reader(f1)
csv_f2= csv.reader(f2)
line = 0
for row1, row2 in zip(csv_f1,csv_f2):
if row1 != row2:
if not row1:
print("file1.csv: Row " + str(line) + " is empty")
continue
if not row2:
print("file2.csv: Row " + str(line) + " is empty")
continue
print(set(row1)-set(row2))
print(line)
line += 1
File 2 with difference highlighted
file2中缺少名字为'Carlos‘的file1中的第5行。
当我运行代码时,我得到以下输出。
这也有另一行(第6行),没有区别。
请原谅我没有张贴图像,因为这样的asI不允许附加图像,它只是作为链接张贴。
发布于 2018-08-09 02:16:42
有了你提供的新信息,我才能把这些放在一起。您使用的代码的问题是,由于两个文件的长度不同,当您将它们压缩在一起时,zip的长度将是列表中条目较少的那个,因此您将丢失信息。此外,由于没有空行,您需要迭代其他列表,以检查您正在查找的项是否在不同的位置。因为您的CSV文件包含一个ID字段,所以我假设它是唯一的,所以我遍历了它:
import csv
import itertools
f1= open("file1.csv")
f2= open("file2.csv")
csv_f1= csv.reader(f1)
csv_f2= csv.reader(f2)
csv_f1 = list(csv_f1)
csv_f2 = list(csv_f2)
line1 = 0
line2 = 0
for row1 in range(0,len(csv_f1)):
found = False
# This checks if a row with the same ID exists in the other file and compares them if it does
for row2 in range(0,len(csv_f2)):
if csv_f1[row1][1] == csv_f2[row2][1]:
found = True
if csv_f1[row1] != csv_f2[row2]:
print("Line " + str(line1) + " from file 1 and line " + str(line2) + " from file 2 have same ID but different data")
print(set(csv_f1[row1])-set(csv_f2[row2]))
if not found:
print("Line " + str(line1) + " from file 1 is not in file 2")
line2 += 1
line1 += 1
https://stackoverflow.com/questions/51752079
复制相似问题