Never let your sense of morals prevent you from doing what is right.

19,964 点击次数

标签: Excel

  • 利用ChatGPT写一个能够自动整理Excel表格的Python

    利用ChatGPT写一个能够自动整理Excel表格的Python

    最近某客户在测试SolarWinds的SEM模块,由于SEM模块目前还在新版本的变革之中,报表功能甚至直接下架,只能依靠羸弱的Web界面去生成报表,呈现的内容无法深度加工,无法满足客户汇总关键信息的需求。身为一个编程小白,为了能够拿下这一单,只能求助ChatGPT了。

    这里我采用的是Sider,对国内用户非常友好,国际主流的AI基本都有了,只要本地网络足够稳定,就不会有任何卡顿,如果需要的同学可以点击以下链接注册,还可以额外赠送多次查询次数。

    这个AI工具超好用,每天都有免费额度,写文章、总结长视频、画图等,都几秒搞定!快去下载Sider Chrome或Edge插件,薅羊毛!
    https://sider.ai/invited?c=7e6ad196e0c3a5eea1d0bbc85e4fbd2c

    接下来进入正文。

    客户需求:

    • 提取指定列中的二级域名。
    • 呈现每一个二级域名的DNS解析次数。

    需求分析:

    根据以上需求看起来还是很简单的,但最重要的是如何去匹配抓取单元格内的二级域名,观察其特征,然后再跟ChatGPT不断沟通确定最终的方案。

    而解析次数就比较简单了,直接统计该二级域名重复的次数即可。

    另外,站在客户的角度来思考问题,肯定是不希望增加自己工作量的,所以我们要替客户尽量简化该脚本的使用步骤,毕竟买了你一个产品,我还要去复杂的运行一个脚本来实现我的需求,搁谁也是不愿意的。

    我所想到的办法是:

    • 首先要自动的处理报表文件,现状是,报表文件导出后是一个zip压缩包,解压之后才能打开csv文件进行查看。不要客户解压缩,统统交给万能的Python做。
    • 然后客户电脑上没有Python。不要客户安装Python,我来把脚本打包成一个exe。
    • 正常情况下是需要传参指定zip文件的。不要客户指定源文件和输出文件路径及文件名,而是直接双击exe,直接自动运行并生成最终客户想要的报表。
    • 最后,客户的DNS日志,涉及多台DNS,为了能够更清晰的呈现不同DNS日志的报告,让脚本抓取原日志中DNS的IP地址并写到文件名中。
    • 根据以上的思考,自认为已经做到了我所能做到的完美了,那下面就开工。

    先跟ChatGPT(下面简称人工智障)说:

    帮我用python写一个脚本,处理一个在zip压缩包中的csv文件(这个文件有点大,170000多行数据,目前是70多MB,未来会更大,所以你写出的脚本需要适应未来的变化,我不希望去分片处理,但是可以在内存中处理),我不想手动解压这个zip文件,我希望python脚本能够自己解压缩,然后处理里面的csv的文件。最终经过下面所要求的方式处理,输出一个xlsx的文件。

    具体需求如下:
    1.提取第L列第一行(ExtraneousInfo)和第AV列第一行(DestinationMachine)以下的数据,也就是从第二行开始提取。
    2.L列的数据需要从右向左检索,在遇到第二个”.”或空格时则停止,只保留第二个”.”或空格右侧的字符。
    以下为L列相关数据举例:
    “Response: “NOERROR”, Flags: “DR”, cecom.oss-cn-beijing.aliyuncs.com”
    “Response: “NOERROR”, Flags: “D”, gstatic.com”
    我想要的数据为:
    “aliyuncs.com”
    “gstatic.com”
    3.完成第二步的工作后,创建一个新的xlsx文件(具体在哪一步创建这个新的xlsx文件由您来决定),并在A列第一行写入“域名”,然后把第二步的内容从第二行开始导入其中。
    4.开始处理xlsx文件中的A列,首先去重,然后在B列第一行命名为“查询次数”,将每一个域名重复出现的次数自动填充在B列的每一个域名对应行的后面。
    5.将csv文件中的第AV列的数据传至xlsx文件的C列,C列第一行命名为“客户端IP地址”,并进行去重。
    6.无论第4、5步如何处理,都要确保在原始的csv文件中他们的ExtraneousInfo和DestinationMachine都能对应上。
    我不希望手动指定zip文件的路径,我希望运行该脚本,该脚本能够自动的读取当前目录下的zip文件并进行处理,然后自动的输出一个名为“DNS查询统计-服务器:xxxxxxx”的xlsx文件,xxxxxxx请读取csv文件E列(DetectionIP)第二行的数据进行替换。

    人工智障自动调用了GPT-4o mini来应对

    可以根据你的需求编写一个完整的Python脚本。这个脚本会自动解压当前目录下的zip文件,读取CSV文件并完成你所要求的处理。以下是满足你需求的代码示例:

    import pandas as pd  
    import zipfile  
    import os  
    import re  
    
    # 获取当前目录下的zip文件路径  
    current_dir = os.getcwd()  
    zip_files = [f for f in os.listdir(current_dir) if f.endswith('.zip')]  
    
    # 检查是否存在zip文件  
    if not zip_files:  
        raise FileNotFoundError("当前目录下没有找到zip文件")  
    elif len(zip_files) > 1:  
        raise RuntimeError("当前目录下存在多个zip文件,请确保只有一个zip文件")  
    
    zip_file_path = os.path.join(current_dir, zip_files[0])  
    
    # 解压缩zip文件并读取CSV  
    with zipfile.ZipFile(zip_file_path, 'r') as zip_ref:  
        # 获取zip中的文件名  
        file_names = zip_ref.namelist()  
        csv_file_name = file_names[0]  
    
        # 读取CSV文件,设置low_memory=False  
        with zip_ref.open(csv_file_name) as csv_file:  
            df = pd.read_csv(csv_file, low_memory=False)  
    
    # 获取E列第二行的数据用于生成文件名  
    server_ip = df.iloc[1, df.columns.get_loc('DetectionIP')]  
    
    # 需求1: 提取L列和AV列的数据  
    extraneous_info = df.iloc[1:, df.columns.get_loc('ExtraneousInfo')]  
    destination_machine = df.iloc[1:, df.columns.get_loc('DestinationMachine')]  
    
    # 需求2: 处理L列数据  
    def extract_domain(info):  
        # 从右向左检索第二个"."或者空格  
        match = re.findall(r'(\.| )[^\. ]+$', info)  
        if len(match) > 1:  
            return info.split(".")[-2] + '.' + info.split(".")[-1]  
        return info  
    
    # 提取域名  
    domains = extraneous_info.apply(extract_domain)  
    
    # 创建DataFrame以存储域名  
    domain_df = pd.DataFrame({'域名': domains})  
    
    # 需求4: 去重并统计查询次数  
    domain_counts = domain_df['域名'].value_counts().reset_index()  
    domain_counts.columns = ['域名', '查询次数']  
    
    # 需求5: 处理DestinationMachine列并去重  
    unique_ips = destination_machine.drop_duplicates().reset_index(drop=True)  
    unique_ips.name = '客户端IP地址'  
    
    # 将数据合并到最终的DataFrame  
    final_df = pd.merge(domain_counts, unique_ips.to_frame(), left_index=True, right_index=True, how='left')  
    
    # 生成输出文件名  
    output_xlsx_path = os.path.join(current_dir, f'DNS查询统计-服务器:{server_ip}.xlsx')  
    
    # 写入输出xlsx文件  
    with pd.ExcelWriter(output_xlsx_path) as writer:  
        final_df.to_excel(writer, index=False)  
    
    print(f'处理完成,结果保存在 {output_xlsx_path}')

    代码说明:

    1. 自动读取zip文件:脚本会查找当前目录下的所有zip文件,并选择第一个进行处理。
    2. 解压CSV文件:通过zipfile库自动解压并读取CSV文件。
    3. 数据处理
      • ExtraneousInfo列提取信息并通过正则表达式来获取域名。
      • 统计重复的域名并生成一个新的DataFrame。
      • DestinationMachine的唯一IP地址添加到输出中。
    4. 创建输出文件:生成的Excel文件命名为DNS查询统计-服务器:xxxxxxx.xlsx,其中xxxxxxxDetectionIP字段的第二行数据。
    5. 保存结果:使用pandasExcelWriter将结果写入新创建的Excel文件中。

    注意事项:

    • 确保你的环境中已安装必要的库:pandas 和 openpyxl。你可以通过以下命令安装:pip install pandas openpyxl

    希望这个脚本能够满足你的需求!如果有任何问题或者需要进一步调整,请告诉我。

    看起来还算可以,至少脚本主体出来了,上VSCode开始调试脚本,调试时发现二级域名提取的不对,点一点人工智障:

    注意我关于L列的要求,请继续修改

    以下为L列相关数据举例: “Response: “NOERROR”, Flags: “DR”, cecom.oss-cn-beijing.aliyuncs.com” “Response: “NOERROR”, Flags: “D”, gstatic.com” 我想要的数据为: “aliyuncs.com” “gstatic.com”

    回复还挺快,立马做出了修改:

    根据你的要求,我将修改代码以提取L列中的域名,确保只获取最后一个点(.)后面的部分。以下是更新后的代码示例:

    import pandas as pd  
    import zipfile  
    import os  
    import re  
    
    # 获取当前目录下的zip文件路径  
    current_dir = os.getcwd()  
    zip_files = [f for f in os.listdir(current_dir) if f.endswith('.zip')]  
    
    # 检查是否存在zip文件  
    if not zip_files:  
        raise FileNotFoundError("当前目录下没有找到zip文件")  
    elif len(zip_files) > 1:  
        raise RuntimeError("当前目录下存在多个zip文件,请确保只有一个zip文件")  
    
    zip_file_path = os.path.join(current_dir, zip_files[0])  
    
    # 解压缩zip文件并读取CSV  
    with zipfile.ZipFile(zip_file_path, 'r') as zip_ref:  
        # 获取zip中的文件名  
        file_names = zip_ref.namelist()  
        csv_file_name = file_names[0]  
    
        # 读取CSV文件,设置low_memory=False  
        with zip_ref.open(csv_file_name) as csv_file:  
            df = pd.read_csv(csv_file, low_memory=False)  
    
    # 获取E列第二行的数据用于生成文件名  
    server_ip = df.iloc[1, df.columns.get_loc('DetectionIP')]  
    
    # 需求1: 提取L列和AV列的数据  
    extraneous_info = df.iloc[1:, df.columns.get_loc('ExtraneousInfo')]  
    destination_machine = df.iloc[1:, df.columns.get_loc('DestinationMachine')]  
    
    # 需求2: 处理L列数据,提取最后一个点后的域名  
    def extract_domain(info):  
        # 使用正则表达式提取最后一个点后的部分  
        match = re.search(r'([^.]+\.[^.]+)$', info)  
        return match.group(0) if match else None  
    
    # 提取域名  
    domains = extraneous_info.apply(extract_domain)  
    
    # 创建DataFrame以存储域名  
    domain_df = pd.DataFrame({'域名': domains})  
    
    # 需求4: 去重并统计查询次数  
    domain_counts = domain_df['域名'].value_counts().reset_index()  
    domain_counts.columns = ['域名', '查询次数']  
    
    # 需求5: 处理DestinationMachine列并去重  
    unique_ips = destination_machine.drop_duplicates().reset_index(drop=True)  
    unique_ips.name = '客户端IP地址'  
    
    # 将数据合并到最终的DataFrame  
    final_df = pd.merge(domain_counts, unique_ips.to_frame(), left_index=True, right_index=True, how='left')  
    
    # 生成输出文件名  
    output_xlsx_path = os.path.join(current_dir, f'DNS查询统计-服务器:{server_ip}.xlsx')  
    
    # 写入输出xlsx文件  
    with pd.ExcelWriter(output_xlsx_path) as writer:  
        final_df.to_excel(writer, index=False)  
    
    print(f'处理完成,结果保存在 {output_xlsx_path}')

    代码修改说明:

    1. 提取域名:在extract_domain函数中,使用正则表达式r'([^.]+\.[^.]+)$'来匹配最后一个点后的部分,确保只提取域名的后缀部分。
    2. 输出格式:最终的DataFrame将包含“域名”、“查询次数”和“客户端IP地址”三列,符合你的要求。

    注意事项:

    • 确保你的环境中已安装必要的库:pandas 和 openpyxl

    如果有其他需求或进一步的修改,请告诉我!

    还是不行,看来得跟人工智障好好唠唠了。

    使用你的脚本,对于以下L列单元格的文本,处理的结果是什么? Response: “NOERROR”, Flags: “DR”, app-analytics-services.com

    人工智障挺着胸脯说道:

    根据你提供的L列单元格文本“Response: “NOERROR”, Flags: “DR”, app-analytics-services.com”,使用我之前提供的脚本处理后,提取的结果将是:

    域名analytics-services.com

    处理过程:

    1. 正则表达式r'([^.]+\.[^.]+)$'会匹配最后一个点后的部分。
    2. 在这个例子中,app-analytics-services.com的最后一个点后是analytics-services.com

    因此,最终的结果会在输出的Excel文件中显示为:

    域名查询次数客户端IP地址
    analytics-services.com179267XXX.XXX.XXX.XXX

    如果你有其他问题或需要进一步的帮助,请告诉我!

    还挺硬气,继续质问它:

    那为何我在执行的时候不是这样的呢?而是没有任何处理的输出到了xlsx文件中

    人工智障不紧不慢的补充道:

    如果在执行脚本时没有任何处理的输出到xlsx文件,可能有几个原因。以下是几种可能性以及相应的解决方法:

    1. 数据未正确读取
      • 确保zip文件中的CSV文件格式正常,并且L列(ExtraneousInfo)和其他列存在。
      • 检查是否存在任何空值或缺失值,可能导致后续处理结果为空。
    2. 正则表达式未匹配
      • 如果文本格式不完全符合预期(例如,前面有多余的空格或换行),正则表达式可能无法正确匹配。
      • 可以通过在extract_domain函数中输出调试信息,查看更多的文本数据,并检查正则表达式是否能正常匹配。
    3. 文件路径和权限问题
      • 确保脚本的工作目录正确,并且可写权限正常。
      • 检查输出路径是否有权限写入文件。
    4. DataFrame为空
      • 在执行到生成输出的步骤时,可以在输出前打印调试信息,例如print(final_df),确认final_df是否包含数据。

    调试步骤:

    • 加入打印调试信息
      在关键步骤前加上打印信息,例如:print("读取到的数据:") print(df.head()) print("提取的域名:") print(domains.head()) print("最终数据:") print(final_df)
    • 检查列名
      确保CSV文件中的列名确实为DetectionIPExtraneousInfoDestinationMachine,避免大小写或额外空格导致的列名不匹配。
    • 单独测试提取函数
      可以单独测试extract_domain函数,确认它能处理你提供的样本数据。

    如果你仍然遇到问题,分享具体的错误信息或输出,我将更能帮助你找到解决方案!

    单独打磨这个正则表达式函数就按下不表了,来来回回几个回合总算找到了病根,并且完美解决。

    这次正确了,那请根据这次修改,重新写之前的脚本吧

    然后,人工智障开始犯智障了。。。。

    当然可以!以下是完整的脚本,包含更新后的extract_domain函数以及测试样本数据部分:

    import re  
    
    def extract_domain(text):  
        # 使用正则表达式提取域名  
        match = re.search(r'([a-zA-Z0-9\-]+\.[a-zA-Z]{2,})', text)  
        if match:  
            return match.group(0)  
        return None  
    
    # 测试样本数据  
    test_cases = [  
        'Response: "NOERROR", Flags: "DR", app-analytics-services.com',  
        'Response: "ERROR", Flags: "DR", example.co.uk',  
        'Some other text, no domain here',  
        'Response: "NOERROR", Flags: "DR", another-example.org'  
    ]  
    
    # 运行测试  
    for case in test_cases:  
        result = extract_domain(case)  
        print(f'输入: "{case}" => 提取的域名: {result}')

    说明:

    1. extract_domain 函数利用正则表达式提取域名。
    2. test_cases 列表中包含多个测试输入,用于验证函数的正确性。
    3. 最后,通过循环遍历测试样本,输出提取的结果。

    你可以将这个脚本复制到你自己的Python环境中运行,应该会得到正确的域名提取结果。如果你有其他需求或问题,请告诉我!

    把人工智障带回主线。

    我的意思是把 def extract_domain(text): # 使用正则表达式提取域名 match = re.search(r'([a-zA-Z0-9\-]+\.[a-zA-Z]{2,})’, text) if match: return match.group(0) return None 这部分代码加入到我引用文本中提及的脚本中去,因为我不懂python,我不会修改。

    根据你的要求,我将修改代码以提取L列中的域名,确保只获取最后一个点(`.`)后面的部分。以下是更新后的代码示例: “`python import pandas as pd import zipfile import os import re # 获取当前目录下的zip文件路径 current_dir = os.getcwd() zip_files = [f for f in os.listdir(current_dir) if f.endswith(‘.zip’)] # 检查是否存在zip文件 if not zip_files: raise FileNotFoundError(“当前目录下没有找到zip文件”) elif len(zip_files) > 1: raise RuntimeError(“当前目录下存在多个zip文件,请确保只有一个zip文件”) zip_file_path = os.path.join(current_dir, zip_files[0]) # 解压缩zip文件并读取CSV with zipfile.ZipFile(zip_file_path, ‘r’) as zip_ref: # 获取zip中的文件名 file_names = zip_ref.namelist() csv_file_name = file_names[0] # 读取CSV文件,设置low_memory=False with zip_ref.open(csv_file_name) as csv_file: df = pd.read_csv(csv_file, low_memory=False) # 获取E列第二行的数据用于生成文件名 server_ip = df.iloc[1, df.columns.get_loc(‘DetectionIP’)] # 需求1: 提取L列和AV列的数据 extraneous_info = df.iloc[1:, df.columns.get_loc(‘ExtraneousInfo’)] destination_machine = df.iloc[1:, df.columns.get_loc(‘DestinationMachine’)] # 需求2: 处理L列数据,提取最后一个点后的域名 def extract_domain(info): # 使用正则表达式提取最后一个点后的部分 match = re.search(r'([^.]+\.[^.]+)$’, info) return match.group(0) if match else None # 提取域名 domains = extraneous_info.apply(extract_domain) # 创建DataFrame以存储域名 domain_df = pd.DataFrame({‘域名’: domains}) # 需求4: 去重并统计查询次数 domain_counts = domain_df[‘域名’].value_counts().reset_index() domain_counts.columns = [‘域名’, ‘查询次数’] # 需求5: 处理DestinationMachine列并去重 unique_ips = destination_machine.drop_duplicates().reset_index(drop=True) unique_ips.name = ‘客户端IP地址’ # 将数据合并到最终的DataFrame final_df = pd.merge(domain_counts, unique_ips.to_frame(), left_index=True, right_index=True, how=’left’) # 生成输出文件名 output_xlsx_path = os.path.join(current_dir, f’DNS查询统计-服务器:{server_ip}.xlsx’) # 写入输出xlsx文件 with pd.ExcelWriter(output_xlsx_path) as writer: final_df.to_excel(writer, index=False) print(f’处理完成,结果保存在 {output_xlsx_path}’) “` ### 代码修改说明: 1. **提取域名**:在`extract_domain`函数中,使用正则表达式`r'([^.]+\.[^.]+)$’`来匹配最后一个点后的部分,确保只提取域名的后缀部分。 2. **输出格式**:最终的DataFrame将包含“域名”、“查询次数”和“客户端IP地址”三列,符合你的要求。 ### 注意事项: – 确保你的环境中已安装必要的库:`pandas` 和 `openpyxl`。 如果有其他需求或进一步的修改,请告诉我!

    人工智障老老实实又重新写了一遍:

    好的!我已经将你提供的代码与之前的 extract_domain 函数结合在一起,确保提取 L 列中的域名。以下是更新后的完整脚本:

    import pandas as pd  
    import zipfile  
    import os  
    import re  
    
    # 获取当前目录下的zip文件路径  
    current_dir = os.getcwd()  
    zip_files = [f for f in os.listdir(current_dir) if f.endswith('.zip')]  
    
    # 检查是否存在zip文件  
    if not zip_files:  
        raise FileNotFoundError("当前目录下没有找到zip文件")  
    elif len(zip_files) > 1:  
        raise RuntimeError("当前目录下存在多个zip文件,请确保只有一个zip文件")  
    
    zip_file_path = os.path.join(current_dir, zip_files[0])  
    
    # 解压缩zip文件并读取CSV  
    with zipfile.ZipFile(zip_file_path, 'r') as zip_ref:  
        # 获取zip中的文件名  
        file_names = zip_ref.namelist()  
        csv_file_name = file_names[0]  
    
        # 读取CSV文件,设置low_memory=False  
        with zip_ref.open(csv_file_name) as csv_file:  
            df = pd.read_csv(csv_file, low_memory=False)  
    
    # 获取E列第二行的数据用于生成文件名  
    server_ip = df.iloc[1, df.columns.get_loc('DetectionIP')]  
    
    # 需求1: 提取L列和AV列的数据  
    extraneous_info = df.iloc[1:, df.columns.get_loc('ExtraneousInfo')]  
    destination_machine = df.iloc[1:, df.columns.get_loc('DestinationMachine')]  
    
    # 需求2: 处理L列数据,提取最后一个点后的域名  
    def extract_domain(info):  
        # 使用正则表达式提取域名  
        match = re.search(r'([a-zA-Z0-9\-]+\.[a-zA-Z]{2,})', info)  
        return match.group(0) if match else None  
    
    # 提取域名  
    domains = extraneous_info.apply(extract_domain)  
    
    # 创建DataFrame以存储域名  
    domain_df = pd.DataFrame({'域名': domains})  
    
    # 需求4: 去重并统计查询次数  
    domain_counts = domain_df['域名'].value_counts().reset_index()  
    domain_counts.columns = ['域名', '查询次数']  
    
    # 需求5: 处理DestinationMachine列并去重  
    unique_ips = destination_machine.drop_duplicates().reset_index(drop=True)  
    unique_ips.name = '客户端IP地址'  
    
    # 将数据合并到最终的DataFrame  
    final_df = pd.merge(domain_counts, unique_ips.to_frame(), left_index=True, right_index=True, how='left')  
    
    # 生成输出文件名  
    output_xlsx_path = os.path.join(current_dir, f'DNS查询统计-服务器:{server_ip}.xlsx')  
    
    # 写入输出xlsx文件  
    with pd.ExcelWriter(output_xlsx_path) as writer:  
        final_df.to_excel(writer, index=False)  
    
    print(f'处理完成,结果保存在 {output_xlsx_path}')

    代码说明:

    1. extract_domain 函数:使用正则表达式提取域名,确保只获取有效的域名格式。
    2. 数据处理:从 CSV 文件中提取数据并处理 L 列,提取域名。
    3. 输出结果:将提取的域名和相关信息写入 Excel 文件。

    注意事项:

    • 确保在运行此脚本之前,已安装 pandas 和 openpyxl 库。
    • 该脚本会在当前工作目录下查找 ZIP 文件并处理其中的 CSV 文件。

    如果你有其他问题或需要进一步的修改,请告诉我!

    接下来还是有问题,来来回回又是几个回合,由于IP地址客户端的问题实在难以解决,客户也不是很关心该列,所以干脆让人工智障去掉算求子。最终,人工智障总算给我了最终的版本,完美,拿代码走人:

    以下是修改后的代码,去掉了客户端IP列的处理和输出:

    import pandas as pd  
    import zipfile  
    import os  
    import re  
    
    # 获取当前目录下的zip文件路径  
    current_dir = os.getcwd()  
    zip_files = [f for f in os.listdir(current_dir) if f.endswith('.zip')]  
    
    # 检查是否存在zip文件  
    if not zip_files:  
        raise FileNotFoundError("当前目录下没有找到zip文件")  
    elif len(zip_files) > 1:  
        raise RuntimeError("当前目录下存在多个zip文件,请确保只有一个zip文件")  
    
    zip_file_path = os.path.join(current_dir, zip_files[0])  
    
    # 解压缩zip文件并读取CSV  
    with zipfile.ZipFile(zip_file_path, 'r') as zip_ref:  
        # 获取zip中的文件名  
        file_names = zip_ref.namelist()  
        csv_file_name = file_names[0]  
    
        # 读取CSV文件,设置low_memory=False  
        with zip_ref.open(csv_file_name) as csv_file:  
            df = pd.read_csv(csv_file, low_memory=False)  
    
    # 获取E列第二行的数据用于生成文件名  
    server_ip = df.iloc[1, df.columns.get_loc('DetectionIP')]  
    
    # 需求1: 提取L列的数据  
    extraneous_info = df.iloc[1:, df.columns.get_loc('ExtraneousInfo')]  
    
    # 需求2: 处理L列数据,提取二级域名  
    def extract_second_level_domain(info):  
        # 使用正则表达式从 DNS 响应日志中提取域名部分  
        match = re.search(r'(?<=,\s)[\w.-]+\.[\w.-]+', info)  
        if match:  
            domain_parts = match.group(0).rsplit('.', 2)  # 分割域名成部分  
            if len(domain_parts) >= 2:  
                return f"{domain_parts[-2]}.{domain_parts[-1]}"  # 返回二级域名  
        return None  
    
    # 提取二级域名  
    second_level_domains = extraneous_info.apply(extract_second_level_domain)  
    
    # 创建DataFrame以存储二级域名  
    domain_df = pd.DataFrame({'二级域名': second_level_domains})  
    
    # 需求4: 去重并统计查询次数  
    domain_counts = domain_df['二级域名'].value_counts().reset_index()  
    domain_counts.columns = ['二级域名', '查询次数']  
    
    # 生成输出文件名  
    output_xlsx_path = os.path.join(current_dir, f'DNS查询统计-服务器:{server_ip}.xlsx')  
    
    # 写入输出xlsx文件  
    with pd.ExcelWriter(output_xlsx_path) as writer:  
        domain_counts.to_excel(writer, index=False)  
    
    print(f'处理完成,结果保存在 {output_xlsx_path}')

    修改说明:

    1. 去掉客户端IP的处理:删除了与客户端IP相关的所有代码,包括提取、去重和合并步骤。
    2. 简化最终输出:只输出二级域名和查询次数的统计结果。

    运行这段代码将只生成包含二级域名和查询次数的Excel文件。如果还有其他需求,请告诉我!

    Python脚本转exe

    好了,脚本在手,调试一切OK,接下来就进行封装转exe了,这个就极为简单了,要确保开发环境安装pyinstaller,然后只需要一条命令就可以搞定,另外我也贴心的给exe文件加了一个ico,美美哒:

    pyinstaller –onefile –nowindowed –icon=”E:\Python\Lib\site-packages_pyinstaller_hooks_contrib\terminal.ico” report_post-processing.py

    至此,完成。

    总结

    跟人工智障的沟通,一定要事无巨细,当然有所遗漏也可以在后面补充,但如果token数量(沟通次数)非常紧张的话,那就必须要仔细打磨你想问的问题了。

    如果人工智障跑偏了实在带不回来了,也没关系,重新建立一个新的会话,重新唠即可。

    最后,有人工智障,真好。