假设我有一个 IP 地址192.168.1.1
我将如何像这样以不同的时间间隔递增?
192.168.1.2
192.168.1.3
...一直到192.168.1.999
,然后“翻转”到192.168.2.1
?
最佳答案
您应该使用 stdlib ipaddress
为了这。不要尝试使用原始字符串操作来完成此操作,因为存在一些陷阱和奇怪的边缘情况。使用面向对象的库将防止您生成无效数据。
迭代从 192.168.1.0 到 192.168.1.255(含)的 ipv4 地址相当于迭代 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
模块。
关于python - python 如何以不同的时间间隔递增?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51070784/