在python中循环IP范围的最简单方法是什么?我看了几个例子,但没有一个适合我。我尝试了以下技术,效果很好,但是当它到达范围的末尾时它不会退出循环。例如,我将通过命令行
指定以下参数python loop.py 1.0.0.0 2.0.0.0
当范围达到2.0.0.0
时,循环不会停止执行start_ip = string.split(sys.argv[1], ".")
end_ip = string.split(sys.argv[2], ".")
for c1 in range(int(start_ip[0]), 255):
for c2 in range(int(start_ip[1]), 255):
for c3 in range(int(start_ip[2]), 255):
for c4 in range(int(start_ip[3]), 255):
if "%d.%d.%d.%d" % (c1, c2, c3, c4) == "%d.%d.%d.%d" % (int(end_ip[0]), int(end_ip[1]), int(end_ip[2]), int(end_ip[3])):
break
else:
print "%d.%d.%d.%d" % (c1, c2, c3, c4)
如果有人能告诉我为什么我的代码无法正常工作,或者告诉我更好的方法来迭代IP范围,那将会很棒,谢谢。所有帮助表示赞赏。
答案 0 :(得分:0)
您的循环逻辑错误。在if
语句中,您与IP地址的上限进行比较,break
语句只会打破if
语句之上的直接循环。
因此它继续在整个范围内运行。你需要打破每个for循环。像这样:
done = False
for c1 in range(int(start_ip[0]), 255):
for c2 in range(int(start_ip[1]), 255):
for c3 in range(int(start_ip[2]), 255):
for c4 in range(int(start_ip[3]), 255):
if "%d.%d.%d.%d" % (c1, c2, c3, c4) == "%d.%d.%d.%d" % (int(end_ip[0]), int(end_ip[1]), int(end_ip[2]), int(end_ip[3])):
done = True
break
else:
print "%d.%d.%d.%d" % (c1, c2, c3, c4)
if(done):
break
if(done):
break
if(done):
break
答案 1 :(得分:0)
由于IP只有4个字节,因此可以表示为单个32位整数。这样,如果我们可以从和转换到这个整数,我们只需要一个循环:
# How much is each byte 'worth' in the ip?
units = [1 << (8 * i) for i in range(3, -1, -1)]
def ip_to_int(ip):
return sum(int(byte) * unit for (byte, unit) in zip(ip.split('.'), units))
def int_to_ip(i):
return '.'.join(str((i / bit) & 0xff) for bit in units)
#----------------------
start_ip = "1.0.0.0"
end_ip = "2.0.0.0"
ips = (int_to_ip(i) for i in xrange(ip_to_int(start_ip), ip_to_int(end_ip)))
for ip in ips:
print ip
这使得循环非常简单,并且还可以让您轻松查看一个IP是否大于另一个IP或等于它(仅比较整数)。