【问题标题】:Creating dynamic variables based on len of list/array根据列表/数组的len创建动态变量
【发布时间】:2017-04-25 22:18:20
【问题描述】:

我正在尝试编写一个在 Cisco 路由器上运行命令并将 IP 列表写入文本文件的程序。我能够将所有 IP 写入文件,然后成功获取所有 IP。现在我遇到麻烦的部分是我不知道我将从列表中获得多少 IP。由于我想将从文件中获得的每个 IP 与用户定义的 IP 进行比较,我想要一种方法来创建基于 IP 数量的动态变量,或者以某种方式遍历所有 IP 并将其与用户的 IP 进行比较。

import re
import ipaddr

userIP = raw_input('Enter IP address to compare i.e, 10.10.10.0/24:')
ipFile = ("router.com.txt")
found = []
with open(ipFile, 'r') as f:
    for text in f.readlines()[1:]: #File had a blank line so this skips it
        text = text.rstrip()
        regex = re.findall(r'(?:[\d]{1,3})\.(?:[\d]{1,3})\.(?:[\d]{1,3})\.(?:[\d]{1,3})\/(?:[\d]{1,3})', text)
        #print regex
        found.append(regex)
    print found
    print len(found) - 1

这是我运行它时得到的:

[['10.10.20.192/27'], ['10.10.40.0/24'], []]
2

现在我苦苦挣扎的困难部分是如何动态地将其中的每一个与变量 userIP 进行比较。

#if userIP.overlaps(found):
#print "Overlapping IPs!!"
#else:
#print "Does not Overlap!!" 

谢谢 达蒙

【问题讨论】:

  • 如果您使用 Python 3.3+,您似乎可以使用内置的 ipaddress 库。但是,对于 Py2.7,您仍然可以使用一个反向移植包:pypi.python.org/pypi/py2-ipaddress
  • 我正在使用 ipaddr.py,它对我来说工作正常。我需要动态变量部分的帮助
  • “动态变量”是什么意思?
  • 我是编程新手,所以这是我想到的第一件事。由于列表长度是动态的,除了动态分配创建 IP 并为它们分配所有 IP 之外,我想不出别的办法。如果有更好的方法我会用它
  • Damon:大多数容器,如列表和字典,都是可变的,这意味着它们的内容几乎可以随时更改。对我来说,“动态变量”是程序在运行时创建的和名称——这通常被认为是一个坏主意,通常可以通过使用可变容器来避免。

标签: python arrays python-2.7 list


【解决方案1】:

您可以像这样将每个 IP 地址与用户输入的子网一一进行比较(实际上它使用的内存比您的代码少):

import re

userIP = raw_input('Enter IP address to compare i.e, 10.10.10.0/24:')
userIP = pseudoSubnetClass(userIP)     # pseudo code
ipFile = ("router.com.txt")
found = []
with open(ipFile, 'r') as f:
    for text in f: #File had a blank line so this skips it
        text = text.rstrip()
        match = re.findall(r'(?:[\d]{1,3})\.(?:[\d]{1,3})\.(?:[\d]{1,3})\.(?:[\d]{1,3})\/(?:[\d]{1,3})', text)
        if not match:
            continue
        found = match[0]
        if userIP.overlaps(found):     # This part is
            print "Overlapping IPs!!"  # pseudo code too
            break
    else:
        print "Does not Overlap!!"

【讨论】:

  • 我按原样编辑了代码 if userIP.overlaps(found): 而不是 if subnet.overlaps(found): 另外,我得到这个: AttributeError: 'str' object has no attribute '重叠'
  • @Damon 你说你正在使用ipaddr.py。条件测试实际上是您的伪代码。你想让我把它改成使用ipaddress吗?
  • 条件测试确实有效(ipaddr.py)。例如:如果 userIP.overlaps(found): 我硬编码了 userIP 并找到了变量,它按预期工作。
  • @Damon:userIP是通过raw_input输入的,必须是str。您后来是否使用该值在某个地方创建了一个对象?
  • 这是最终计划,但为了加快测试速度,我对其进行了硬编码:userIP = "10.10.10.0/24"
【解决方案2】:

我认为一旦您考虑到re.findall 将在文件本身的所有行中提取所有 IP,您就可以避免很多复杂性,您不需要有自己的循环。例如:

import re

userIP = raw_input('Enter IP address to compare i.e, 10.10.10.0/24:')
ipFile = "router.com.txt"

with open(ipFile) as f:
    for ip in re.findall(r'(?:[\d]{1,3})\.(?:[\d]{1,3})\.(?:[\d]{1,3})\.(?:[\d]{1,3})\/(?:[\d]{1,3})', f.read()):
        if overlaps(ip, userIP):
            print "Overlapping IPs!!"
            break

overlaps() 函数只是一个虚构的示例,以帮助说明其余的逻辑。

【讨论】:

  • @Philip Tzou 和您的解决方案在我解决了一个明显的问题后奏效了。你能告诉我哪个是更好的解决方案吗?此列表通常不会增长超过 10 个 IP,但我可能会将其用于未来的项目。哪个效率更高?感谢大家的帮助;)
【解决方案3】:

这就是你想要的吗?

append 更改为extend,以便生成的列表类似于['10.10.20.192/27', '10.10.40.0/24', '']

found.extend(regex)

询问userIP 是否与找到的任何匹配:

if userIP in found:
    <suite>

【讨论】:

    猜你喜欢
    • 2023-01-13
    • 1970-01-01
    • 2021-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多