【发布时间】: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 normalization 的Zero, 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