代码之家  ›  专栏  ›  技术社区  ›  Ryan Horan

Python3:在元组列表中搜索具有公共IP地址的值

  •  1
  • Ryan Horan  · 技术社区  · 7 年前

    我试图编写一个脚本,从sqlite3数据库中提取数据,并只输出感兴趣的特定数据。

    我编写了一个函数:

    def get_ip(db_file):
        cur = con.cursor()
        cur.execute('select "Computer Name","User", "IP Address1", "IP Address2", "IP Address3", "IP Address4" from SepData')
        ip_data = cur.fetchall()
        cur.close()
        return ip_data
    

    这将产生:

    [('user-PC1', 'upc1', '172.24.49.88', '0.0.0.0', '33.4.1.54', '0.0.0.0'), ('user-pc2', 'upc2', '64.24.49.90', '0.0.0.0', '0.0.0.0', '0.0.0.0'), ('user-pc3', 'upc3', '172.24.49.71', '0.0.0.0', '0.0.0.0', '0.0.0.0'), ('user-pc4', 'upc4', '172.24.89.101', '192.168.3.3', '0.0.0.0', '55.13.0.1'),]
    

    我的目的是提取全球/公共IP及其附属用户,并将这些数据存储为有序列表/目录。我认为可能存在重复条目,因此我认为唯一的方法是使用列表。

    如果用户只显示专用或不可路由的IP,则希望忽略此数据。

    最初,我试图在SQL查询中执行此操作,但这仅在REGEXP函数中可行,该函数默认情况下不随sqlite3提供,可能会导致其他人在使用脚本时遇到问题。我现在正在尝试使用python IP地址 图书馆我将元组列表转换为列表列表,并尝试以下操作:

    pubips = ()
    iplist = get_ip('dbfile')
    itr = range(1,4)
    for host, user, ipaddr1, ipaddr2, ipaddr3, ipaddr4 in zip(iplist):
        for i in itr:
            if ipaddr+i.is_global():
            pubips.insert(user, ipaddr+i)
    

    这段代码显然不起作用,但给出了我试图实现的总体思路。我正在努力想出一个干净的方法来做到这一点,如果有任何反馈,我将不胜感激。感谢阅读

    2 回复  |  直到 7 年前
        1
  •  0
  •   Dash Winterson    7 年前

    我会做几件事,首先我会通过只选择IP地址来更好地准备数据。

    def get_ip(db_file):
        cur = con.cursor()
        cur.execute('SELECT "IP Address1", "IP Address2", "IP Address3", "IP Address4" FROM SepData')
        query= cur.fetchall()
        cur.close()
        return query
    

    接下来,您可以使用集合来处理准备好的数据,以确保唯一性,并使用ipaddress

    import itertools
    import ipaddress
    
    def unique_global_ips(query):
        ips= itertools.chain.from_iterable(query)
        return set([ip for ip in ips if ipaddress.ip_address(ip).is_global])
    

    有些人试图避免列表理解,因为它们可能会违背自己的目的,变得不可读,但我认为这是一个恰当的用法。

        2
  •  0
  •   Ryan Horan    7 年前

    我非常感谢各位的反馈,但经过一些单元测试后,我实际上创建了一个更好地回答我问题的解决方案:

    pubips = {}
    for row in hostips_lists:
        for ip in row[2:6]:
            if ipaddress.ip_address(unicode(ip)).is_global:
                pubips[row[0]] = ip
    

    我需要用户与ip的关系保持完整,所以我创建了一个dict,但感谢您引导我朝着正确的方向前进。