【问题标题】:Python 3.5 netaddr not merging IP's correctlyPython 3.5 netaddr 没有正确合并 IP
【发布时间】:2017-03-28 09:39:46
【问题描述】:

我目前有一个非常大的 IP 列表,我正在尝试尽可能多地减少这些 IP。使用netaddr 模块的cidr_merge() 方法,我希望我的列表会大大压缩。但是,它似乎没有按预期工作。

例如,给定以下 IP,我希望它们可以合并,如下所示:

5.8.183.1
5.8.183.2
5.8.183.5
5.8.183.6
5.8.183.10
5.8.183.14
5.8.183.18
5.8.183.22
5.8.183.26
5.8.183.30
5.8.183.34
5.8.183.38
5.8.183.42
5.8.183.46

合并到:5.8.183.0/26

cidr_merge() 方法的实际结果是:

5.8.183.1/32
5.8.183.2/32
5.8.183.5/32
5.8.183.6/32
5.8.183.10/32
5.8.183.14/32
5.8.183.18/32
5.8.183.22/32
5.8.183.26/32
5.8.183.30/32
5.8.183.34/32
5.8.183.38/32
5.8.183.42/32
5.8.183.46/32

这是我的代码:

from netaddr import *

try:
    with open('nodes', 'r') as in_file:
        dat_ips = [IPNetwork(line) for line in in_file.read().splitlines()]

    dat_merged_ips = cidr_merge(dat_ips)

    with open('output.txt', 'w') as out_file:
        for x in dat_merged_ips:
            out_file.write(str(x) + '\n')

except IOError:
    print('File error detected:')

【问题讨论】:

    标签: python networking ip subnet cidr


    【解决方案1】:

    根据您提供的 IP 地址列表,netaddr 和您的脚本似乎工作正常。您需要相邻的 IP 地址进行汇总。以这个节点文件为例:

    5.8.183.1
    5.8.183.2
    5.8.183.3
    5.8.183.4
    5.8.183.5
    5.8.183.6
    5.8.183.7
    5.8.183.8
    

    脚本的输出是:

    [IPNetwork('5.8.183.1/32'), IPNetwork('5.8.183.2/31'), IPNetwork('5.8.183.4/30')]

    获取这个节点列表:

    5.8.183.1
    5.8.183.2
    5.8.183.3
    5.8.183.4
    5.8.183.5
    5.8.183.6
    5.8.183.7
    5.8.183.8
    5.8.183.9
    5.8.183.10
    5.8.183.11
    5.8.183.12
    5.8.183.13
    5.8.183.14
    5.8.183.15
    

    输出:

    [IPNetwork('5.8.183.1/32'), IPNetwork('5.8.183.2/31'), IPNetwork('5.8.183.4/30'), IPNetwork('5.8.183.8/29')]

    【讨论】:

      猜你喜欢
      • 2018-01-02
      • 1970-01-01
      • 1970-01-01
      • 2017-05-25
      • 1970-01-01
      • 1970-01-01
      • 2011-02-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多