如何在不同的时间间隔增加python?

时间:2018-06-27 20:19:10

标签: python ip-address

说我有一个IP地址192.168.1.1 我将如何以不同的时间间隔递增?

192.168.1.2
192.168.1.3

...一直到192.168.1.999,然后“翻转”到192.168.2.1吗?

5 个答案:

答案 0 :(得分:3)

您应该为此使用stdlib ipaddress。不要尝试用原始的字符串操作来完成它,因为有一些陷阱和奇怪的边缘情况。使用面向对象的库可以保护您避免生成无效数据。

要将ipv4地址从192.168.1.0迭代到192.168.1.255(含),等同于迭代192.168.1.0/24 subnet。使用network对象:

>>> from ipaddress import ip_network
>>> list(ip_network('192.168.1.0/24'))
[IPv4Address('192.168.1.0'),
 IPv4Address('192.168.1.1'),
 IPv4Address('192.168.1.2'),
...
 IPv4Address('192.168.1.255')]

其中一些地址不是可用的主机,例如255是broadcast address。如果您要查找的是hosts,则进行迭代:

>>>> list(ip_network('192.168.1.0/24').hosts())
[IPv4Address('192.168.1.1'),
 IPv4Address('192.168.1.2'),
 IPv4Address('192.168.1.3'),
...
 IPv4Address('192.168.1.254')]

请注意,192.168.1.999不是有效的IP地址,请不要生成该地址!验证器仍然会阻止您创建它:

>>> from ipaddress import ip_address
>>> ip_address('192.168.1.254')
IPv4Address('192.168.1.254')
>>> ip_address('192.168.1.999')
# ValueError: '192.168.1.999' does not appear to be an IPv4 or IPv6 address

要从ip address object转换回普通的旧字符串,只需在其上调用str

您的问题还询问有关“过渡到” 192.168.2.1的问题。这只是迭代另一个子网。 192.168.1.0/24中的24是指分配给网络前缀的24个有效位(其余8位保留用于主机寻址),即子网掩码 255.255.255.0。

要使其成为“过渡”,您实际上只想迭代一个更大的子网:

>>> gen = iter(ip_network('192.168.0.0/16'))
>>> for i in range(255*2):
...     next(gen)
...     
>>> next(gen)
IPv4Address('192.168.1.254')
>>> next(gen)
IPv4Address('192.168.1.255')
>>> next(gen)
IPv4Address('192.168.2.0')
>>> next(gen)
IPv4Address('192.168.2.1')

要从单个ip地址字符串到网络对象,可以使用supernet方法:

>>> from ipaddress import ip_address, ip_interface
>>> ip = ip_address('192.168.1.1')
>>> net = ip_interface(ip).network
>>> net
IPv4Network('192.168.1.1/32')
>>> net.supernet(prefixlen_diff=8)
IPv4Network('192.168.1.0/24')

详细了解Internet Protocol version 4和Python ipaddress模块的官方文档。

答案 1 :(得分:1)

for ip3 in range(1, 127):
    for ip4 in range(1, 999):
        ip = '.'.join("192", "68", str(ip3), str(ip4))

这会给你个主意吗?

答案 2 :(得分:0)

# for IP addresses of the form 1.92.168.a.b

a_max = 10
b_max = 999

ips = []
for a in range(a_max):
    for b in range(b_max):
        ips += ['1.92.168.{}.{}'.format(a,b)]

这将为您提供生成为字符串的所有IP地址的列表。

答案 3 :(得分:0)

您可以使用ip_address.split(.)分割地址,得到ip_list。跟踪您要记住的限制。转换为整数后,递增ip_list的每个元素,然后转换回字符串,并使用".".join(ip_list)

将它们重新放在一起

答案 4 :(得分:-1)

您可以使用__add__方法创建一个类:

class Ip:
 def __init__(self, _ip:str, _stop = 999) -> None:
   self.ip = _ip
   self.stop = _stop
 def __add__(self, _val):
   _ip = list(map(int, self.ip.split('.')))
   _r = 0
   while _r < 4:
     result = _ip[3 -_r]+_val
     if result < self.stop:
       _ip[3 - _r] += _val
       break
     _ip[3 - _r] += _val%self.stop
     _val = _val%self.stop
     _r += 1
     _ip[4 - _r] = 1
   return Ip('.'.join(map(str, _ip)))
 def __repr__(self):
   return f'<IP {self.ip}>'

p = Ip('192.168.1.1')
new_p = p + 1
print(new_p)
print(p + 1000)

输出:

<IP 192.168.1.2>
<IP 192.168.2.1>