说我有一个IP地址192.168.1.1
我将如何以不同的时间间隔递增?
192.168.1.2
192.168.1.3
...一直到192.168.1.999
,然后“翻转”到192.168.2.1
吗?
答案 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>