Python3:在元组列表中搜索具有 public 个 IP 地址的值
Python3: Search List of tuples for values which have public IP addresses
我正在尝试编写一个脚本,从 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'),]
我的目的是提取 global/public 个 IP 和与它们相关的用户,并将这些数据存储为有序的 list/dict。我相信可能会有重复的条目,所以我认为唯一的方法是使用列表。
如果用户仅显示私有或不可路由的 IP,我希望忽略此数据。
最初我试图在 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)
此代码显然不起作用,但给出了我要完成的任务的总体思路。我正在努力想出一种干净的方法来做到这一点,并希望得到任何反馈。感谢阅读
我会做一些事情,首先我会通过只选择 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
接下来可以使用set来处理准备好的数据,确保唯一性,并使用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])
有些人试图避免列表推导式,因为它们会破坏他们自己的目的并变得不可读,但我认为这是一种合适的用法。
非常感谢小伙伴们的反馈,但经过一些单元测试后,我实际上创建了一个可以更好地解决我的问题的解决方案:
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,但是感谢您引导我朝着正确的方向前进。
我正在尝试编写一个脚本,从 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'),]
我的目的是提取 global/public 个 IP 和与它们相关的用户,并将这些数据存储为有序的 list/dict。我相信可能会有重复的条目,所以我认为唯一的方法是使用列表。
如果用户仅显示私有或不可路由的 IP,我希望忽略此数据。
最初我试图在 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)
此代码显然不起作用,但给出了我要完成的任务的总体思路。我正在努力想出一种干净的方法来做到这一点,并希望得到任何反馈。感谢阅读
我会做一些事情,首先我会通过只选择 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
接下来可以使用set来处理准备好的数据,确保唯一性,并使用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])
有些人试图避免列表推导式,因为它们会破坏他们自己的目的并变得不可读,但我认为这是一种合适的用法。
非常感谢小伙伴们的反馈,但经过一些单元测试后,我实际上创建了一个可以更好地解决我的问题的解决方案:
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,但是感谢您引导我朝着正确的方向前进。