【问题标题】:Python3: Search List of tuples for values which have public IP addressesPython3:在元组列表中搜索具有公共 IP 地址的值
【发布时间】:2018-06-13 12:25:11
【问题描述】:

我正在尝试编写一个脚本,该脚本从 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 查询中执行此操作,但据我所知,这仅是可行的。我现在正在尝试仅使用 python ipaddress 库。我将元组列表转换为列表列表,并正在尝试这样的事情:

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)

这段代码显然不起作用,但可以大致了解我要完成的工作。我正在努力想出一种干净的方式来做到这一点,并希望得到任何反馈。感谢阅读

【问题讨论】:

  • 此架构违反了database normalizationZero, One or Infinity Rule。用于存储 IP 地址的具有一对多关系的辅助表将为您提供 N 个可能的地址,而不是将此模式任意限制为四个。这些列名也完全是残骸,有些有空格,有些没有,根本没有一致性。保持架构尽可能干净,这很重要。列名中的空格往往非常烦人。
  • is_global() 是如何工作的?你确定你使用正确吗?
  • 据我所知,is_global 将验证公共范围内的 ipv4 地址。可悲的是,架构不是我可以控制的东西。
  • 这就是它的作用。它是如何工作的?你用字符串调用它吗?你传入一个字符串吗?如果您说的是this library,那么您需要先调用ip_address 将其转换为正确的对象类型。
  • 我明白你的意思并同意,我写的代码或多或少是伪代码。我必须添加类似 my_ip = ipaddress.ip_address('ipaddr) 的内容。我并没有声称自己是 python 专家,并且知道我写的东西很丑,因此我在这里发帖

标签: python list dictionary sqlite ip-address


【解决方案1】:

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

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 关系,所以我创建了一个字典,不过感谢您引导我朝着正确的方向前进。

【讨论】:

    【解决方案2】:

    我会做一些事情,首先我会通过仅选择 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])
    

    有些人试图避免列表推导,因为他们可能会破坏自己的目的并变得不可读,但我认为这是一个合适的用法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多