脚本小子的自我救赎

在这里插入图片描述


       IP域名提取工具,之前用HTML+js写了个,后来发现大文件复制粘贴之后直接卡死,之前也写过,比较短,零零碎碎的要么只有IP,要么只有域名,还没有多线程,索性就再用python 脚本写一个,权当练手,大佬轻喷。

一、流程设计

       这个没啥好说的,直接上图。从文件类型匹配,到大文件分割,最终返回要读取的文件列表,使用多线程读取文件并进行IP域名匹配,最终写入文件,下图只是初步设计的思路,可能跟最终代码某些部分不是很匹配。
在这里插入图片描述

二、实现功能

       本来以为可以简单写下,一码码了几百行,主要是因为分的情况有点多,端口、协议、去重、读文件、读目录、从文件分割、多线程读取。
repo:https://github.com/SevenC-base/Gadgets/

1、大文件分割

        # 打开分割的大文件
        with open (file_name, "r", encoding="utf-8") as f0:
            buf = f0.readlines ()
            all_line_num = len (buf)
            counter = all_line_num // LINE_NUM
            print ("------------------------------------------分割总数: %s-------------------" % counter)
            tail_counter = all_line_num % LINE_NUM
            # print ("tail_counter-> ", tail_counter)
            # 行数不够直接跳出,前去匹配
            if all_line_num <= LINE_NUM:
                print ("行数不够", all_line_num)
            else:
                while n < counter + 2:
                    # 在data目录下构造需要分割的大文件的每一个小文件文件名,eg:abc.txt -> abc-split-1.txt
                    filename_write_path = file_path1 + "\\data---split\\" + filename0 + "-split-%s" % n + ".txt"
                    # 分割后的小文件名
                    # filename_split = filename0 + "-split-%s" % n + file_suffix
                    # 分割后小文件存储列表
                    filename_split_list.append (filename_write_path)
                    # 最后不满2000000行的直接从末尾计算
                    if n == counter + 1:
                        with open (filename_write_path, "w") as f1:
                            for b in buf[-tail_counter:]:
                                f1.write (b)
                    else:
                        with open (filename_write_path, "w") as f2:
                            for b1 in buf[(n * LINE_NUM):((n + 1) * LINE_NUM)]:
                                f2.write (b1)
                    n = n + 1

2、多线程读文件

    if len (files_list_all) > 10:
        # list_num分割后单个列表长度
        list_num = len (files_list_all) // 10
        # 线程池
        threads = []
        # 列表存储结果
        result = {'r1': [], 'r2': [], 'r3': [], 'r4': []}
        # 按照10个线程拆分读取的文件列表
        for i in range (10):
            list_f = files_list_all[i * (list_num + 1):(i + 1) * (list_num + 1)]
            if len (list_f) != 0:
                thread1 = MyThread (func=test.read_file_list, args=(files_list_all, args, pattern0))
                thread1.start ()
                threads.append (thread1)
        # 阻塞主线程,获取每个线程执行结果
        for j in threads:
            j.join ()
            ree = j.get_result ()
            # print (ree)
            # 判断key键是否存在
            for k, v in ree.items ():
                if k in result.keys ():
                    result[k] = ree[k] + result[k]
                else:
                    pass

三、效果展示

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值