Skip to main content
 首页 » 编程设计

python之将 2 个 .csv 文件与 Python 进行比较,然后输出结果

2025年05月04日7cyq1162

我在编程方面相当陌生,我正在尝试编写一个 python 程序,该程序将按特定列比较 2 个 .csv 文件并检查添加、删除和修改。 .csv 文件均采用以下格式,包含相同数量的列,并使用 BillingNumber 作为键:

BillingNumber,CustomerName,IsActive,IsCreditHold,IsPayScan,City,State 
"2","CHARLIE RYAN","Yes","No","Yes","Reading","PA" 
"3","INSURANCE BILLS","","","","","" 
"4","AAA","","","","","" 

我只需要比较第 0、1、2 和 4 列。我尝试了很多不同的方法来完成这个,但我没有任何运气。我知道我可以使用 csv.DictReader 或 csv.reader 将它们加载到字典中,但之后我就卡住了。将它们加载到内存后,我不确定从哪里或如何开始。

我之前试过这个:

import time 
old_lines = set((line.strip() for line in open(r'Old/file1.csv', 'r+'))) 
file_new = open(r'New/file2.csv', 'r+') 
 
choice = 0 
choice = int( input('\nPlease choose your result format.\nEnter 1 for .txt, 2 for .csv or 3 for .json\n') ) 
time.sleep(1) 
print(".") 
time.sleep(1) 
print("..") 
time.sleep(1) 
print("...") 
time.sleep(1) 
print("....") 
time.sleep(1) 
print('Done! Check "Different" folder for results.\n') 
if choice == 1: 
    file_diff = open(r'Different/diff.txt', 'w') 
elif choice == 2: 
    file_diff = open(r'Different/diff.csv', 'w') 
elif choice == 3: 
    file_diff = open(r'Different/diff.json', "w") 
else:  
    print ("You MUST enter 1, 2 or 3") 
    exit() 
 
for line in file_new: 
    if line.strip() not in old_lines: 
        file_diff.write("** ERROR! Entry "+ line + "** Does not match previous file\n\n") 
file_new.close() 
file_diff.close() 

它不能正常工作,因为如果有额外的行,或者缺少一行,它会将该行之后的所有内容记录为不同的。它还比较了整条线,这不是我想要做的。这基本上只是一个起点,虽然它有点管用,但它不够具体,无法满足我的需要。我真的只是在寻找一个好的起点。谢谢!

请您参考如下方法:

我认为您使用 csv 模块的方向正确。由于“BillingNumber”是唯一键,我会为“旧”账单文件创建一个字典,为"new"账单文件创建另一个字典:

import csv 
 
def make_billing_dict(csv_dict_reader): 
    bdict = {} 
    for entry in csv_dict_reader: 
        key = entry['BillingNumber'] 
        bdict[key] = entry 
    return bdict 
 
with open('old.csv') as csv_file: 
    old = csv.DictReader(csv_file) 
    old_bills = make_billing_dict(old) 

这导致 old_bills 的数据结构:

{'2': {'BillingNumber': '2', 
       'City': 'Reading', 
       'CustomerName': 'CHARLIE RYAN', 
       'IsActive': 'Yes', 
       'IsCreditHold': 'No', 
       'IsPayScan': 'Yes', 
       'State': 'PA'}, 
 '3': {'BillingNumber': '3', 
       'City': '', 
       'CustomerName': 'INSURANCE BILLS', 
       'IsActive': '', 
       'IsCreditHold': '', 
       'IsPayScan': '', 
       'State': ''}, 
 '4': {'BillingNumber': '4', 
       'City': '', 
       'CustomerName': 'AAA', 
       'IsActive': '', 
       'IsCreditHold': '', 
       'IsPayScan': '', 
       'State': ''}} 

一旦您为"new"账单文件创建了相同的数据结构,您就可以轻松找到不同之处:

# Keys that are in old_bills, but not new_bills 
print set(old_bills.keys()) - set(new_bills.keys()) 
 
# Keys that are in new_bills, but not old_bills 
print set(new_bills.keys()) - set(old_bills.keys()) 
 
# Compare columns for same billing records 
# Will print True or False 
print old_bills['2']['CustomerName'] == new_bills['2']['CustomerName'] 
print old_bills['2']['IsActive'] == new_bills['2']['IsActive'] 

显然,您不会为每个比较编写单独的打印语句。我只是在演示如何使用数据结构来查找差异。接下来,您应该编写一个函数来遍历所有可能的 BillingNumbers 并检查新旧版本之间的差异……但我会把这部分留给您。