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

时间:2018-01-03 19:32:13

标签: python list dictionary sqlite ip-address

我正在尝试编写一个脚本,该脚本从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,则Id会忽略此数据。

最初我尝试在SQL查询中执行此操作,但这只能用于REGEXP函数,但默认情况下不会附带sqlite3,并且可能导致其他人在使用脚本时遇到问题。我现在正尝试使用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)

这段代码显然不起作用,但总体上说明了我想要实现的目标。我正在努力想出一个干净的方法,并希望得到任何反馈。感谢您的阅读

2 个答案:

答案 0 :(得分:0)

我会做一些事情,首先我会通过仅选择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])
有些人试图避免列表理解,因为它们可能会破坏自己的目的而变得难以理解,但我认为这是一种合适的用途。

答案 1 :(得分:0)

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

mv abc_xyz*.out /path/to/new/folder/

我需要用户 - ip关系完好无损,所以我创建了一个词典,感谢你指引我正确的方向。