在Python中,如何根据一个列中的值比较两个csv文件,并从第一个文件输出与第二个不匹配的记录

幻想曲

python和编码的新手。我一直在寻找几个csv比较问题和答案,却找不到任何有助于解决此特定比较问题的方法。

我有两个包含网络资产信息的文件。某些设备在一个文件中有多个IP地址,而在另一个文件中只有一个地址。而且它们似乎不共享大写或小写格式。我对他们的主机名值感兴趣。

(文件没有标题)

文件1:

HOSTNAME1,10.0.0.1
HOSTNAME2,10.0.0.2
HOSTNAME3,10.19.0.3
hostname4,10.19.0.4,10.19.17.31,10.19.17.32,10.19.17.33,10.19.17.34
hostname5,10.19.0.40,10.19.17.51,10.19.17.52,10.19.17.53,10.19.17.54
hostname6,10.19.0.55,10.19.17.56,10.19.17.57,10.19.17.58,10.19.17.59

文件2

HOSTNAME4,10.19.0.4
HOSTNAME5,10.19.0.40
HOSTNAME6,10.19.0.55
hostname7,192.168.0.1
hostname8,192.168.0.2
hostname9,192.168.0.3

我想根据主机名(列0)比较这些文件,并输出到包含file1中不在file2中的行的第三个文件,忽略大小写,并忽略它们在file1或file2中是否具有多个IP。

所需的输出:

文件3:

HOSTNAME1,10.0.0.1
HOSTNAME2,10.0.0.2
HOSTNAME3,10.19.0.3

我在bash中尝试了一个简单的comm命令,以尝试查看是否可以生成所需的结果并且没有运气,所以我决定在python中尝试

comm -23 --nocheck-order file1.csv file2.csv > file3.csv

这是我在python中尝试过的方法:

with open('file1.csv', 'r') as f1, open('file2.csv', 'r') as f2:
    fileone = f1.readlines()
    filetwo = f2.readlines()

with open('file3.csv', 'w') as outFile:
    for line in fileone:
        if line not in filetwo:
            outFile.write(line)

问题是它没有写IP列表不完全匹配的行。即使在第1列中它们共享一个主机名,如果该行在一个文件中有多个ip,也不会计算在内。

我不确定上面的代码是否忽略大小写,并且似乎试图从一行中匹配整个字符串,而不是“包含”。

愿意尝试pandas软件包,如果这种比较更有意义

丹·纳格

您自己的代码离您要做的事情不太远。

步骤1:从中的主机名列表创建一个集合file2.csv此处,主机名更改为大写。

with open('file2.csv') as check_file:
    check_set = set([row.split(',')[0].strip().upper() for row in check_file])

第2步:遍历的行,file1.csv并检查主机名是否在集合中。

with open('file1.csv', 'r') as in_file, open('file3.csv', 'w') as out_file:
    for line in in_file:
        if line.split(',')[0].strip().upper() not in check_set:
            out_file.write(line)

生成的文件file3.csv内容:

HOSTNAME1,10.0.0.1
HOSTNAME2,10.0.0.2
HOSTNAME3,10.19.0.3

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

Related 相关文章

热门标签

归档