首页 > 解决方案 > 比较 2 个 csv 文件之间的列并使用 Python 编写差异

问题描述

我试图通过比较 2 个 csv 文件之间的列来打印出差异。

CSV1:

SERVER,   FQDN,   IP_ADDRESS,  
serverA, device1.com, 10.10.10.1  
serverA,device2.com,10.11.11.1  
serverC,device3.com,10.12.12.1   
and so on..

CSV2:

FQDN, IP_ADDRESS, SERVER,  LOCATION  
device3.com,10.12.12.1,serverC,xx  
device679.com,20.3.67.1,serverA,we  
device1.com,10.10.10.1,serverA,ac  
device345.com,192.168.2.0,serverA,ad  
device2.com,192.168.6.0,serverB,af  
and so on...

我要做的是比较 FQDN 列并将差异写入新的 csv 输出文件。所以我的输出看起来像这样:

输出.csv:

FQDN, IP_ADDRESS, SERVER, LOCATION  
device679.com,20.3.67.1,serverA,we  
device345.com,192.168.2.0,serverA,ad  
and so on..

我已经尝试过,但无法获得输出。

这是我的代码,请告诉我哪里出错了;

import csv

data = {}  # creating list to store the data

with open('CSV1.csv', 'r') as lookuplist:
 reader1 = csv.reader(lookuplist)
 for col in reader1:
    DATA[col[0]] = col[1]

with open('CSV2.csv', 'r') as csvinput, open('Output.csv', 'w', newline='') as f_output:
 reader2 = csv.reader(csvinput)
 csv_output = csv.writer(f_output)
 fieldnames = (['FQDN', 'IP_ADDRESS', 'SERVER'])
 csv_output.writerow(fieldnames)  # prints header to the output file

    for col in reader1:
     if col[1] not in reader2:
        csv_output.writerow(col)  

(编辑)这是我使用的另一种方法:

import csv

f1 = (open("CSV1.csv"))
f2 = (open("CSV2.csv"))

csv_f1 = csv.reader(f1)
csv_f2 = csv.reader(f2)

for col1, col2 in zip(csv_f1, csv_f2):
    if col2[0] not in col1[1]:
    print(col2[0])

基本上,在这里我只是想首先找出是否打印了不匹配的 FQDN。但它正在打印出整个 CSV1 列。请帮助大家,对此进行了大量研究,但还没有找到运气!:(

标签: pythonpython-3.xpandascsvpython-3.6

解决方案


此代码使用内置的difflib吐出file1.csv未出现的行,file2.csv反之亦然。

我使用该Differ对象来识别线路更改。我假设您不会将换行视为差异,这就是我添加sorted()函数调用的原因。

from difflib import Differ
csv_file1 = sorted(open("file1.csv", 'r').readlines())
csv_file2 = sorted(open("file2.csv", 'r').readlines())
with open("diff.csv", 'w') as f:
    for line in Differ().compare(csv_file1,csv_file2)):
        dmode, line = line[:2], line[2:]
        if dmode.strip() == "":
            continue
        f.write(line + "\n")

请注意,如果该行以某种方式不同(不仅在FQDN列中),它将出现在diff.csv


推荐阅读