Python:从IP地址列表生成IP范围

Pre*_*nde 5 python arrays

我有一个.csv文件,其中包含少数数据中心的IP地址列表.该列表目前看起来类似于下表:

  Data_Center_Name      IP
              DC_1      52.102.182.2
              DC_1      52.102.182.4
              DC_1      52.102.182.1
              DC_1      52.102.182.5
              DC_1      52.102.182.3
              DC_1      27.101.178.17
              DC_1      27.101.178.16
              DC_1      27.101.178.15
              DC_1      23.201.165.7
              DC_2      55.200.162.10
              DC_2      55.200.162.12
              DC_2      55.200.162.13
              DC_2      55.200.162.11
              DC_3      30.101.102.4
Run Code Online (Sandbox Code Playgroud)

我想将列表转换为单个列表,例如:

     DC_1 = [52.102.182.1-52.102.182.5,
             27.101.178.15-27.101.178.17,
             23.201.165.7]
     DC_2 = [55.200.162.10-55.200.162.13]
     DC_3 = [30.101.102.4]
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮我使用python吗?

sal*_*ise 2

使用python3(如果需要,我可以使用python2)

\n\n

利用ipaddressgroupby内置库以及其他内置功能:

\n\n

创建将 ipaddress 对象列表转换为范围的函数:

\n\n
def create_range(ip_addresses):\n    groups=[]\n    for _, g in itertools.groupby(enumerate(sorted(ip_addresses)), lambda (i,x):i-int(x)):\n       group = map(operator.itemgetter(1), g)\n       if len(group) > 1:\n           groups.append("{}-{}".format(group[0], str(group[-1]).split(\'.\')[-1]))\n       else:\n           groups.append(str(group[0]))\n    return groups\n
Run Code Online (Sandbox Code Playgroud)\n\n

导入所需的库,从 csv 中解析出值(用于StringIO模拟从文件中读取):

\n\n
import csv ## for reading csv file\nimport ipaddress ## for creating ip address objects\nimport io ## for mimicking reading csv file\nimport operator ## for grouping operation\nimport itertools ## for grouping operation\nimport collections ## for creating a defaultdict\n\nips = defaultdict(list)\ncsv_file = u"""Data_Center_Name,      IP\n              DC_1,      50.102.182.2\n              DC_1,      52.102.182.4\n              DC_1,      52.102.182.1\n              DC_1,      52.102.182.5\n              DC_1,      52.102.182.3\n              DC_1,      27.101.178.17\n              DC_1,      27.101.178.16\n              DC_1,      27.101.178.15\n              DC_1,      23.201.165.7\n              DC_2,      55.200.162.10\n              DC_2,      55.200.162.12\n              DC_2,      55.200.162.13\n              DC_2,      55.200.162.11\n              DC_3,      30.101.102.4\n"""\n\nwith io.StringIO(csv_file) as f:\n    reader = list(csv.reader(f))\n    for (dc, ip) in reader[1:]:\n        ip = ipaddress.IPv4Address(unicode(ip.strip()))\n        ips[dc.strip()].append(ip)\n    result = {dc: create_range(ip_range) for dc, ip_range in ips.items()}\n
Run Code Online (Sandbox Code Playgroud)\n\n

结果:

\n\n
In [92]: result\nOut[92]:\n{\'DC_1\': [\'23.201.165.7\',\n  \'27.101.178.15-17\',\n  \'50.102.182.2\',\n  \'52.102.182.1\',\n  \'52.102.182.3-5\'],\n \'DC_2\': [\'55.200.162.10-13\'],\n \'DC_3\': [\'30.101.102.4\']}\n
Run Code Online (Sandbox Code Playgroud)\n\n

Python2

\n\n
import csv ## for reading csv file\nimport ipaddress ## for creating ip address objects\nfrom StringIO import StringIO  ## for mimicking reading csv file\nimport operator ## for grouping operation\nimport itertools ## for grouping operation\nimport collections ## for creating a defaultdict\n\ndef create_range(ip_addresses):\n    groups=[]\n    for _, g in itertools.groupby(enumerate(sorted(ip_addresses)), lambda (i,x):i-int(x)):\n       group = map(operator.itemgetter(1), g)\n       if len(group) > 1:\n           groups.append("{}-{}".format(group[0], str(group[-1]).split(\'.\')[-1]))\n       else:\n           groups.append(str(group[0]))\n    return groups\n\nips = collections.defaultdict(list)\n\ncsv_file = """Data_Center_Name,      IP\n              DC_1,      50.102.182.2\n              DC_1,      52.102.182.4\n              DC_1,      52.102.182.1\n              DC_1,      52.102.182.5\n              DC_1,      52.102.182.3\n              DC_1,      27.101.178.17\n              DC_1,      27.101.178.16\n              DC_1,      27.101.178.15\n              DC_1,      23.201.165.7\n              DC_2,      55.200.162.10\n              DC_2,      55.200.162.12\n              DC_2,      55.200.162.13\n              DC_2,      55.200.162.11\n              DC_3,      30.101.102.4\n"""\n\nreader = csv.reader(StringIO(csv_file))\nnext(reader)\nfor (dc, ip) in reader:\n    ip = ipaddress.IPv4Address(unicode(ip.strip()))\n    ips[dc.strip()].append(ip)\nresult = {dc: create_range(ip_range) for dc, ip_range in ips.items()}\n
Run Code Online (Sandbox Code Playgroud)\n\n

py2 代码的结果

\n\n
print result\n{\'DC_2\': [\'55.200.162.10-13\'], \'DC_3\': [\'30.101.102.4\'], \'DC_1\': [\'23.201.165.7\', \'27.101.178.15-17\', \'50.102.182.2\', \'52.102.182.1\', \'52.102.182.3-5\']}\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

确实有效!谢谢。可以得到输出:{\'DC_2\': [\'55.200.162.10-55.200.162.13\'], \'DC_3\': [\'30.101.102.4\'], \'DC_1\' :[\'23.201.165.7\'、\'27.101.178.15-27.101.178.17\'、\'50.102.182.2\'、\'52.102.182.1\'、\'52.102.182.3-52.102.182.5\'] } \xe2\x80\x93

\n
\n\n

是的,更改这一行:

\n\n
groups.append("{}-{}".format(group[0], str(group[-1]).split(\'.\')[-1]))\n
Run Code Online (Sandbox Code Playgroud)\n\n

对此:

\n\n
groups.append("{}-{}".format(group[0], group[-1]))\n
Run Code Online (Sandbox Code Playgroud)\n