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] 删除。
我来说两句