首页 > 解决方案 > 如何从文件中的 CIDR 生成所有 IP?

问题描述

我有一个包含 CIDR 的文件,如下所示:

1.2.3.4/10
5.6.7.8/20
...

我想读取 CIDR 文件,然后将所有 IP 写入另一个文件。

已经尝试过这个 python 代码,但不知道如何读取每一行,然后执行以下操作:

from netaddr import *

f = open("everyip.txt", "w")
ip = IPNetwork('10.0.0.0/8')

for addr in ip:
    f.write(str(addr) + '\n')

f.close()

编辑

我也已经尝试过了:

from netaddr import *

f = open("everyip.txt", "w")

with open("cidrs.txt") as f:
  content = f.readlines()
  content = [x.strip() for x in content] 
  str1 = ''.join(content)
  ip = IPNetwork(str1)

for addr in ip:
  f.write(str(addr) + '\n')

f.close()

这仅适用于cidrs.txt. 如果 1 行以上cidrs.txt,则会引发错误并且不起作用。

编辑2:

我试过这个但得到一个错误:

from netaddr import *
i = 0
f = open("everyip.txt", "w")
with open("range.txt") as f1:
    content = f1.readlines()
    content = [x.strip() for x in content]
    while (i < len(content)):
        ip = IPNetwork(content[i])
        for addr in ip:
            f.write(str(addr) + '\n')
        f.close()

错误:

f.write(str(addr) + '\n')
ValueError: I/O operation on closed file.

标签: python

解决方案


OP将此作为对他们问题的编辑发布。

固定的:

from netaddr import *
with open("range.txt") as f1:
    content = f1.readlines()
    content = [x.strip() for x in content]
    with open("everyip.txt", "w") as f:
        for i in content:
            ip = IPNetwork(i)
            for addr in ip:
                f.write(str(addr) + '\n')

如果有大量行,最好一次处理一条,而不是全部读入内存。

from netaddr import *
with open("range.txt") as f1, open("everyip.txt", "w") as f:
    for line in f1:
        cidr = line.rstrip('\n')
        ip = IPNetwork(cidr)
        for addr in ip:
            f.write(str(addr) + '\n')

推荐阅读