利用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文件并完成你所要求的处理。以下是满足你需求的代码示例:

[/crayon]

代码说明:

  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列中的域名,确保只获取最后一个点(.)后面的部分。以下是更新后的代码示例:

[/crayon]

代码修改说明:

  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函数以及测试样本数据部分:

[/crayon]

说明:

  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地址”三列,符合你的要求。 ### 注意事项: – 确保你的环境中已安装必要的库:pandasopenpyxl。 如果有其他需求或进一步的修改,请告诉我!

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

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

[/crayon]

代码说明:

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

注意事项:

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

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

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

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

[/crayon]

修改说明:

  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数量(沟通次数)非常紧张的话,那就必须要仔细打磨你想问的问题了。

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

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

打赏作者

作者: Centro Sun

Maintainer,Engineer,Fixer

《利用ChatGPT写一个能够自动整理Excel表格的Python》有2个想法

发表回复

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