IP合并小工具-Python版本


=Start=

缘由:

最近的工作中涉及到一些IP属性分析的内容,在最后分析整理的差不多了之后,需要将对应的IP或IP段合并再展开成单个IP的形式,方便给其它系统/工具使用。这次是用Python写的,主要是借助netaddr模块的功能来实现IP段的合并,后续抽时间看能不能用Golang实现一版,也学习积累一下Golang的编程经验。

正文:

参考解答:

在当前目录下放置一个名为【IP-company.txt】的文件,文件格式如下:

# company_name
ip1 - ip2
ip3
ip4/28

# company_name2
ipX - ipY
ip11

然后执行该脚本,会在当前目录下生成名为【ip_company.txt】的结果文件,文件格式如下:

ip1,company_name,20201022

#!/usr/bin/env python3
# coding=utf-8
import sys, time
from netaddr import *

def ip_format(ip_str):
    var_list = []
    for item in ip_str.strip().split('.'):
        var_list.append(str(int(item)))
    return '.'.join(var_list)

def main():
    company_ip_map = {}
    company_str = ''
    ipset = IPSet()
    with open('IP-company.txt') as fp:
        for line in fp:
            line = line.strip()
            if line:
                if line.startswith('#') and len(line) > 1:
                    company_str = line[1:].lower().strip()
                    ipset.clear()
                    continue
                else:
                    if ' - ' in line:
                        ip_start, ip_end = line.split(' - ', 1)
                        ipset.add(IPRange(ip_format(ip_start), ip_format(ip_end)))
                    else:
                        ipset.add(line)
                    #
                    if company_str in company_ip_map:
                        company_ip_map[company_str] = company_ip_map[company_str] | ipset
                    else:
                        company_ip_map[company_str] = ipset
                    #
                #
            else:
                continue
            #
        #
    #
    for item in company_ip_map:
        print(item, company_ip_map[item].size)
    #
    with open('ip_company.txt', 'w') as fw:
        for item in company_ip_map:
            print(item, company_ip_map[item].size)
            astr = '\n'.join('{0},{1},20201022'.format(str(e), item) for e in company_ip_map[item])
            fw.write( astr )
            fw.write('\n')
    #
#


if __name__ == '__main__':
    time_start = time.time()
    try:
        main()
    except KeyboardInterrupt:
        print('Killed by user')
        sys.exit(0)
    print("\nSpend {0} seconds.\n".format(time.time() - time_start))

参考链接:

Python的netaddr模块使用记录
https://ixyzero.com/blog/archives/2707.html

阿里云IP段的整理
https://ixyzero.com/blog/archives/4961.html

=END=

, ,

《“IP合并小工具-Python版本”》 有 1 条评论

  1. question
    Python3中分析和合并IP地址的快速简易的方法都有哪些?

    answer

    在 Python3 中,如果你需要快速、简易地分析和合并 IP 地址(IPv4 或 IPv6),有以下几种方法可以使用,从标准库到第三方库都有,适用于不同场景。

    最佳实践建议:
    * 小项目、学习、基础脚本 → 使用 ipaddress
    * 高性能需求、复杂网络操作 → 使用 netaddr (推荐)
    * 快速合并离散IP为CIDR → 使用 ipranges
    * 已有系统工具链支持 → 使用命令行工具 + Python 调用

    使用 netaddr 模块等好处:
    * netaddr.IPAddress 可以自动识别 IPv4 和 IPv6。
    * cidr_merge() 是该库提供的一个非常强大的函数,可以将离散的 IP 自动合并为最少数量的 CIDR 块。
    * 支持大规模 IP 数据处理,性能优于标准库 ipaddress。

    question
    写一段Python代码,用netaddr模块来实现,读取cidr格式的IP列表文件,然后输出为每行一个IP地址的功能。输入文件和输出文件都通过命令行参数来进行指定。

回复 hi 取消回复

您的邮箱地址不会被公开。 必填项已用 * 标注