【发布时间】:2014-01-27 16:09:20
【问题描述】:
在Python中,如果我想生成一个IP地址形式的随机字符串怎么办?
例如:"10.0.1.1"、"10.0.3.14"、"172.23.35.1" 等。
有人可以帮我吗?
【问题讨论】:
标签: python ip-address
在Python中,如果我想生成一个IP地址形式的随机字符串怎么办?
例如:"10.0.1.1"、"10.0.3.14"、"172.23.35.1" 等。
有人可以帮我吗?
【问题讨论】:
标签: python ip-address
>>> import random
>>> import socket
>>> import struct
>>> socket.inet_ntoa(struct.pack('>I', random.randint(1, 0xffffffff)))
'197.38.59.143'
>>> socket.inet_ntoa(struct.pack('>I', random.randint(1, 0xffffffff)))
'228.237.175.64'
注意这可能会生成像0.0.0.0、255.255.255.255 这样的 IP。
【讨论】:
for n in range(0x01020408, 0x08040201): ... socket.inet_ntoa(...)
如果你只想要一个字符串:
import random
ip = ".".join(map(str, (random.randint(0, 255)
for _ in range(4))))
【讨论】:
".".join(str(randint(0, 255)) for _ in range(4))
In [123]: '.'.join('%s'%random.randint(0, 255) for i in range(4))
Out[123]: '45.204.56.200'
In [124]: '.'.join('%s'%random.randint(0, 255) for i in range(4))
Out[124]: '7.112.222.205'
【讨论】:
这可能太明显了,但如果您需要某个范围内的随机 IP,您可以使用:
import random
for x in xrange(1,100):
ip = "192.168."
ip += ".".join(map(str, (random.randint(0, 255)
for _ in range(2))))
print ip
【讨论】:
https://faker.readthedocs.io/en/latest/providers/faker.providers.internet.html
import faker
fake = Factory.create()
ip_addr = fake.ipv4(network=False)
lib 有很多其他有用的选项来伪造数据。
【讨论】:
from faker import Faker
faker = Faker()
ip_addr = faker.ipv4()
【讨论】:
另一种以 IP 地址形式生成随机字符串的方法是:
>>> ip = '{}.{}.{}.{}'.format(*__import__('random').sample(range(0,255),4))
>>> ip
'45.162.105.102'
【讨论】:
您还可以使用 Python 的 ipaddress module,它更广泛地用于创建、操作和操作 IPv4 和 IPv6 地址和网络:
import ipaddress
import random
MAX_IPV4 = ipaddress.IPv4Address._ALL_ONES # 2 ** 32 - 1
MAX_IPV6 = ipaddress.IPv6Address._ALL_ONES # 2 ** 128 - 1
def random_ipv4():
return ipaddress.IPv4Address._string_from_ip_int(
random.randint(0, MAX_IPV4)
)
def random_ipv6():
return ipaddress.IPv6Address._string_from_ip_int(
random.randint(0, MAX_IPV6)
)
例子:
>>> random.seed(444)
>>> random_ipv4()
'79.19.184.109'
>>> random_ipv4()
'3.99.136.189'
>>> random_ipv4()
'124.4.25.53'
>>> random_ipv6()
'4fb7:270d:8ba9:c1ed:7124:317:e6be:81f2'
>>> random_ipv6()
'fe02:b348:9465:dc65:6998:6627:1300:29c9'
>>> random_ipv6()
'74a:dd88:1ff2:bfe3:1f3:81ad:debd:db88'
【讨论】:
np.random.randint() 只能达到 2 ** 64 - 1,一个 64 位整数,而 ipaddress.IPv6Address._ALL_ONES 是 128 位。如果您只需要一个随机地址,请使用random; NumPy 是为数组设计的。
from faker import Factory
fake_generator = Factory.create()
print(fake_generator.ipv4())
请务必在尝试运行上述程序之前进行 pip install!
pip install Faker
【讨论】:
如果尝试仅基于用户空间(192.168.xxx.xxx、172.16.xxx.xxx-172.31.255.255 和 10.xxx.xxx.xxx)生成私有 IP 地址
This 的帖子给出了很好的答案
如果您尝试生成任何其他内容,可以被认为是公开的,请使用这个(我的代码基于上面的帖子):
import random
def randomPublicIPaddress():
'''
oct 1 - cant be 10
oct 2 - if oct1 == 192
cant be 168
if oct1 == 172
cant be 16-31
oct 3 - can be anything
oct 4 - can be anything
'''
oct1 = random.choice([i for i in range(0,255) if i not in [10,127]])
if oct1 == 192:
oct2 = random.choice([i for i in range(0,255) if i not in [168]])
elif oct1 == 172:
oct2 = random.choice([i for i in range(0,255) if i not in range(16,31)])
else:
oct2 = random.randint(0,255)
oct3 = random.randint(0,255)
oct4 = random.randint(0,255)
return ".".join(map(str,([oct1,oct2,oct3,oct4])))
警告,还有许多其他 IP 地址范围被视为“私有”,请务必查看 IANA 上的列表
【讨论】: