You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 21:52:50