Python 比较两个csv文件并获得差异

Python 比较两个csv文件并获得差异,python,csv,Python,Csv,我需要比较两个csv文件,然后说出不同之处: CSV格式: Name Produce Number Adam Apple 5 Tom Orange 4 Adam Orange 11 我需要比较两个csv文件,然后告诉我工作表和工作表2上的Adams Apple之间是否存在差异,并对所有名称和编号进行比较。两个CSV文件的格式相同 非常感谢任何指针比较两个不同文件的最佳实用程序之一是 请参见此处的Python实现:此处是不使用difflib的开始

我需要比较两个csv文件,然后说出不同之处:

CSV格式:

 Name   Produce   Number
 Adam   Apple     5
 Tom    Orange    4
 Adam   Orange    11
我需要比较两个csv文件,然后告诉我工作表和工作表2上的Adams Apple之间是否存在差异,并对所有名称和编号进行比较。两个CSV文件的格式相同


非常感谢任何指针

比较两个不同文件的最佳实用程序之一是


请参见此处的Python实现:

此处是不使用
difflib
的开始。这真的只是一个要点,因为也许亚当和苹果会出现两次;你能保证情况并非如此吗?这些苹果是应该加起来的,还是一个错误

import csv
fsock = open('sheet.csv','rU')
rdr = csv.reader(fsock)
sheet1 = {}
for row in rdr:
    name, produce, amount = row
    sheet1[(name, produce)] = int(amount) # always an integer?
fsock.close()
# repeat the above for the second sheet, then compare
你明白了吗?

导入csv
import csv

def load_csv_to_dict(fname, get_key, get_data):
    with open(fname, 'rb') as inf:
        incsv = csv.reader(inf)
        incsv.next()  # skip header
        return {get_key(row):get_data(row) for row in incsv}

def main():
    key = lambda r: tuple(r[0:2])
    data = lambda r: int(r[2])
    f1 = load_csv_to_dict('file1.csv', key, data)
    f2 = load_csv_to_dict('file2.csv', key, data)

    f1keys = set(f1.iterkeys())
    f2keys = set(f2.iterkeys())

    print("Keys in file1 but not file2:")
    print(", ".join(str(a)+":"+str(b) for a,b in (f1keys-f2keys)))

    print("Keys in file2 but not file1:")
    print(", ".join(str(a)+":"+str(b) for a,b in (f2keys-f1keys)))

    print("Differing values:")
    for k in (f1keys & f2keys):
        a,b = f1[k], f2[k]
        if a != b:
            print("{}:{} {} <> {}".format(k[0],k[1], a, b))

if __name__=="__main__":
    main()
def load_csv_to_dict(fname,get_key,get_data): 以open(fname,'rb')作为inf: incsv=csv.reader(inf) incsv.next()#跳过标题 返回{get_key(row):为incsv中的行获取_数据(row)} def main(): key=lambda r:tuple(r[0:2]) data=lambda r:int(r[2]) f1=加载csv到dict('file1.csv',键,数据) f2=加载csv到dict('file2.csv',键,数据) f1keys=set(f1.iterkeys()) f2keys=set(f2.iterkeys()) 打印(“文件1中的键,而不是文件2:”) 打印(“,”.join(str(a)+:“+str(b)表示a,b在(f1keys-f2keys))中) 打印(“文件2中的键,而不是文件1:”) 打印(“,”.join(str(a)+:“+str(b)表示a,b在(f2keys-f1keys))中) 打印(“不同的值:”) 对于k in(F1键和F2键): a、 b=f1[k],f2[k] 如果是b: 打印(“{}:{}{}{}”。格式(k[0],k[1],a,b)) 如果名称=“\uuuuu main\uuuuuuuu”: main()
如果您的CSV文件不是那么大,如果您将其加载到内存中,它们会使您的机器瘫痪,那么您可以尝试以下方法:

import csv
csv1 = list(csv.DictReader(open('file1.csv')))
csv2 = list(csv.DictReader(open('file2.csv')))
set1 = set(csv1)
set2 = set(csv2)
print set1 - set2 # in 1, not in 2
print set2 - set1 # in 2, not in 1
print set1 & set2 # in both

对于大型文件,可以将它们加载到SQLite3数据库中,并使用SQL查询执行相同的操作,或者按相关键排序,然后执行匹配合并

如果希望将Python的csv模块与函数生成器一起使用,可以使用嵌套循环并比较大型.csv文件。下面的示例使用粗略比较来比较每一行:

import csv

def csv_lazy_get(csvfile):
    with open(csvfile) as f:
        r = csv.reader(f)
        for row in r:
            yield row

def csv_cmp_lazy(csvfile1, csvfile2):
    gen_2 = csv_lazy_get(csvfile2)

    for row_1 in csv_lazy_get(csvfile1):
        row_2 = gen_2.next()

        print("row_1: ", row_1)
        print("row_2: ", row_2)

        if row_2 == row_1:
            print("row_1 is equal to row_2.")
        else:
            print("row_1 is not equal to row_2.")

    gen_2.close()
我用过csvdiff

$pip install csvdiff
$csvdiff --style=compact col1 a.csv b.csv 


您使用的是什么版本的Python?您已经用
excel
标记了它,但提到了CSV文件。您需要使用xlsx或xls文件吗?您可能会发现,
diff
可以满足您的需求,但您并没有真正说明是否需要进行大量工作并将其构建到现有的python程序中。很抱歉,您是正确的。当我在空闲状态下尝试此操作时,我会得到以下信息:(使用pastebin,以便您可以查看整个错误消息的格式)csv1列表中的DICT不可散列,因此无法创建set1。这可以通过将dicts转换为带有@HK_CK的字符串来避免。好的,我很高兴您能将其添加到回答中。。。只是不要像你建议的那样改变它…类型错误:不可损坏的类型:“dict”。来吧