如何将CIDR子网转换为IP地址列表?解决Python代码报错
如何将多个子网转换为IP地址列表?
问题场景
我有一个subnets.txt文件,内容如下:
1.1.1.1/26 2.2.2.2/28 3.3.3.3/29 4.4.4.4/30
想要把这些子网全部展开成对应的IP地址列表,但尝试的代码报错。
错误尝试及问题
尝试1:读取整个文件内容处理
代码:
import ipaddress with open('subnets.txt', 'r') as file1: the_ip=file1.read() for ip in ipaddress.ip_network(the_ip): print(f'IP: {ip}')
报错:
ValueError: "['1.1.1.1/26', '2.2.2.2/28', '3.3.3.3/29', '4.4.4.4/30']" does not appear to be an IPv4 or IPv6 network
尝试2:直接使用子网列表
代码:
ips_list = ['1.1.1.1/26', '2.2.2.2/28', '3.3.3.3/29', '4.4.4.4/30'] for ip in ipaddress.ip_network(ips_list): print(f'IP: {ip}')
同样报错:
"ips_list = ['1.1.1.1/26', '2.2.2.2/28', '3.3.3.3/29', '4.4.4.4/30']" does not appear to be an IPv4 or IPv6 network
问题原因
ipaddress.ip_network()函数仅接受单个子网字符串作为参数,不能直接传入包含多个子网的字符串(比如整个文件的内容)或列表。之前的代码错误地将多个子网的集合传给了这个函数,导致识别为无效网络地址。
解决方法
需要逐个遍历每个子网,分别调用ipaddress.ip_network()处理,再展开每个子网下的IP地址。
处理文件的完整代码
import ipaddress with open('subnets.txt', 'r') as file1: # 按行读取文件,去除每行的换行符,过滤空行 subnets = [line.strip() for line in file1 if line.strip()] for subnet in subnets: # strict=False允许子网地址不是严格的网络起始地址(可选,根据实际子网情况调整) network = ipaddress.ip_network(subnet, strict=False) print(f"--- 子网 {subnet} 的IP列表 ---") for ip in network: print(ip)
处理子网列表的完整代码
import ipaddress ips_list = ['1.1.1.1/26', '2.2.2.2/28', '3.3.3.3/29', '4.4.4.4/30'] for subnet in ips_list: network = ipaddress.ip_network(subnet, strict=False) print(f"--- 子网 {subnet} 的IP列表 ---") for ip in network: print(ip)
说明
strict=False参数:如果你的子网是用子网内的某个IP(而非网络地址)加上掩码表示的,这个参数可以避免报错;如果所有子网都是标准的网络起始地址,也可以省略该参数。- 代码会逐个处理每个子网,展开并输出该子网下的所有IP地址。
内容的提问来源于stack exchange,提问作者Saeed
相关产品推荐
相关产品推荐

