Python中如何生成IP地址?
from IPy import IP IP('172.10.250-254.250-254') Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/local/lib/python2.7/site-packages/IPy.py", line 242, in init raise ValueError("only one '-' allowed in IP Address") ValueError: only one '-' allowed in IP Address</module></stdin>
IPy 好像不支持这种生成方式,Python 有哪些库可以解决这个问题么?
Python中如何生成IP地址?
生成IP地址通常有两种需求:生成单个随机IP或生成指定范围内的IP列表。
1. 生成单个随机IP地址:
import random
import ipaddress
def generate_random_ip():
# 生成随机的IPv4地址
return str(ipaddress.IPv4Address(random.randint(0, 2**32 - 1)))
# 使用示例
print(generate_random_ip()) # 输出类似:192.168.1.1
2. 生成IP地址范围:
import ipaddress
def generate_ip_range(start_ip, end_ip):
start = int(ipaddress.IPv4Address(start_ip))
end = int(ipaddress.IPv4Address(end_ip))
return [str(ipaddress.IPv4Address(ip)) for ip in range(start, end + 1)]
# 使用示例
ip_list = generate_ip_range('192.168.1.1', '192.168.1.5')
print(ip_list) # 输出:['192.168.1.1', '192.168.1.2', '192.168.1.3', '192.168.1.4', '192.168.1.5']
3. 生成CIDR格式的所有IP:
def generate_cidr_ips(cidr):
network = ipaddress.ip_network(cidr, strict=False)
return [str(ip) for ip in network.hosts()] # hosts()排除网络地址和广播地址
# 使用示例
ips = generate_cidr_ips('192.168.1.0/29')
print(ips) # 输出该网段所有可用主机IP
关键点:
- 使用Python内置的
ipaddress库处理IP地址最规范 - 生成随机IP时注意避免生成保留地址
- 处理大范围IP时考虑内存使用
建议直接使用ipaddress库处理IP相关操作。
IP 段不连续,不符合规范,唯有用 random 库手撸
ValueError: only one ‘-’ allowed in IP Address
emmmmm 是这样的
我要按输入的语句生成 ip 地址,只是拿 IPy 举了个栗子
比如说我输入
172.10.100-101.1-3
生成
172.10.100.1
172.10.100.2
172.10.100.3
172.10.101.1
172.10.101.2
172.10.101.3
------------------------
撸了一中午 还没写出来
我现在的想法是:
把输入的字符串 split(’.’)分割
把分割出的 list 循环读取出来
读取出来的内容用 split(’-’)分割
------
上面这些都写出来了
但是组合方法我实在是写不出来了 没有头绪
不要老想着这是一个 IP 地址,就结束了:
lambda x: ["%d.%d.%d.%d"%d for d in itertools.product([range(m,n+1) for s in x.split(".") for m,n,_ in [map(int, (s+"-"+s).split("-"))]])]
#5 看起来需要重练基本功……
emmm 谢了大佬
手动委屈.gif
https://docs.python.org/3/library/ipaddress.html#ip-network-definitions
Python3 标准库 ipaddress 可以处理 IP 网段,考虑用 CIDR 格式划分子网?
基本功太差
随手写了一个,没考虑效率方面的问题:
def create_ip_address(one, two, three, four):
int_list = []
for i in one, two, three, four:
if isinstance(i, int):
i = [i]
i_len = len(i)
if i_len == 1:
int_list.append(i)
elif i_len == 2:
int_list.append(range(i[0], i[1]+1))
else:
raise ValueError(‘元组内只能有 1~2 个数字’)
ip_list = []
for s in int_list:
s_list = [str(w) for w in s]
if not ip_list:
ip_list = s_list
else:
ip_list = [’.’.join([o, p]) for p in s_list for o in ip_list]
return ip_list
if name == ‘main’:
test_create = create_ip_address(1, (3, 50), (5, 6), (7, 8))
print(len(test_create), test_create)
图: https://s1.ax1x.com/2018/10/20/i01I00.jpg
注:也没考虑捣乱的情况


