【问题标题】:Python: Efficient way to compare ip addresses in a csv filePython:比较 csv 文件中 ip 地址的有效方法
【发布时间】:2015-08-30 13:42:45
【问题描述】:

我有一个包含以下 IP 地址列表的 csv 文件:

SSH IP                NFS IP                iSCSI IP
10.xxx.xxx.aaa        172.xxx.xxx.aaa       172.yyy.xxx.aaa
10.xxx.xxx.bbb        172.xxx.xxx.bbb       172.yyy.xxx.bbb
10.xxx.xxx.ccc        172.xxx.xxx.ccc       172.yyy.xxx.ccc
10.xxx.xxx.ddd        172.xxx.xxx.ddd       172.yyy.xxx.ddd
...                   ...                   ...
...                   ...                   ...

我想比较 SSH IP、NFS IP 和 iSCSI IP 中的最后一个八位字节,如果它们匹配,我想通过 ssh 进入框中执行一些命令。

考虑到我的情况,我想知道比较最后一个八位字节的最有效方法。对此的任何帮助将不胜感激。

附:我在 ssh 进入盒子时没有任何问题,我打算使用 paramiko 库。

【问题讨论】:

  • 那么到目前为止,您的尝试有什么不妥?
  • @WoodyPride 这是我的示例数据:SSH IP NFS IP 192.168.201.xxx 172.20.103.xxx 192.168.201.zzz 172.20.103.yyy 192.168.201.yyy 172.29.103.zzz ... .... 基本上,如果 SSH IP 192.168.201.xxx 中的最后一个八位字节与 NFS ip 172.20.103.xxx 中的最后一个八位字节匹配,那么我想 ssh 进入 192.168.201.xxx 并执行远程执行一些命令。我也会使用 NFS ip。我想对文件中的所有 IP 地址执行此操作。

标签: python python-2.7 pandas compare ip-address


【解决方案1】:

我想使用re,这里是一个例子。

代码:

import re
regex = re.compile('([^\.]+\.){3}(?P<ssh>[^\s\n\.]+)(\s+([^\.]+\.){3}(?P=ssh)){2}\n')

with open(file) as ff:
    for line in ff:
        m = regex.search(line)
        if m:
            # do what you want
            print m.group()

文件内容:

SSH IP                NFS IP                iSCSI IP
10.xxx.xxx.aaa        172.xxx.xxx.aaa       172.yyy.xxx.aaa
10.xxx.xxx.bbb        172.xxx.xxx.bbb       172.yyy.xxx.bbb
10.xxx.xxx.ccc        172.xxx.xxx.ccc       172.yyy.xxx.ccc
10.xxx.xxx.ddd        172.xxx.xxx.ddd       172.yyy.xxx.ddd
10.xxx.xxx.eee        172.xxx.xxx.eee       172.yyy.xxx.eeef
10.xxx.xxx.fff        172.xxx.xxx.fff       172.yyy.xxx.ffg

输出:

10.xxx.xxx.aaa        172.xxx.xxx.aaa       172.yyy.xxx.aaa

10.xxx.xxx.bbb        172.xxx.xxx.bbb       172.yyy.xxx.bbb

10.xxx.xxx.ccc        172.xxx.xxx.ccc       172.yyy.xxx.ccc

10.xxx.xxx.ddd        172.xxx.xxx.ddd       172.yyy.xxx.ddd

【讨论】:

    【解决方案2】:

    一种简单的方法是使用 Python CSV 库一次导入一行数据。然后使用列表推导将 IP 地址拆分为组件,取出最后一个并将其添加到集合中。如果该集合的长度为 1,则您知道所有列都是相同的。

    我假设上述数据显示的是 CSV 文件,并且是制表符分隔的:

    import csv
    
    reader = csv.reader(open(r"addresses.csv", "rb"), delimiter="\t")
    
    for lCols in reader:
        try:
            if len(set([szIP.split(".")[3] for szIP in lCols])) == 1:
                print "\t".join(lCols)
        except:
            pass     # Skip non IP address formatted rows
    

    如果您正在寻找最快的解决方案,我强烈建议您针对此代码对任何正则表达式解决方案进行计时以确定哪个是最好的,因为哪个最好并不总是显而易见的。

    如果您的 CSV 文件采用不同的格式,则只需执行额外的列表理解步骤即可将其转换为上面显示的数据。

    【讨论】:

      猜你喜欢
      • 2014-08-20
      • 2021-09-07
      • 1970-01-01
      • 2012-08-26
      • 2021-01-10
      • 2016-01-07
      • 2015-09-29
      • 2010-11-04
      • 2020-02-13
      相关资源
      最近更新 更多