2016-11-14 67 views
0

我目前有一個非常大的IP列表,我試圖儘可能地減少IP地址。使用netaddr模塊的cidr_merge()方法,我期待着我的清單被大大縮小。但是,它似乎沒有按預期工作。Python 3.5 netaddr沒有正確合併IP地址

例如,給出以下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:') 

回答

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')]