使用Python批量提取Zip包内CSV信息并生成可检索目录
问题解决:遍历Zip生成关联目录(Excel输出)
问题场景
我有一个包含3000多个Zip文件夹的目录,每个Zip内有1-4个CSV文件:
- Zip文件夹命名格式:
CSV_2023_Q2_XXXXXXX_XXXXXXX.ZIP - CSV文件前缀:
202306_COMPANY_NAME_LLC...,后缀包含_ident.CSV、_contracts.CSV、_indexPub.CSV、_transactions.CSV,且每个Zip至少包含_ident.csv(大小写可能不一致) - 需求:遍历所有Zip,生成关联Zip名称与CSV中公司名称的可检索目录,优先输出为Excel文件
原代码问题分析
你提供的代码生成的CSV只有表头无数据,核心原因有两个:
- 大小写不匹配:代码中判断
file.endswith("_ident.csv"),但实际CSV文件后缀可能是大写.CSV,导致找不到目标文件,ident_file始终为None,无法添加数据到列表 - 公司名提取逻辑不准确:原代码仅截取
_ident.csv前的全部内容,包含了日期前缀(如202306_),不符合提取公司名称的需求
修复后的代码
以下是修正后的代码,同时满足Excel输出的需求:
import os import zipfile import pandas as pd # 替换为你的目标目录路径 main_folder = "你的Zip文件夹根目录路径" folder_file_info = [] # 遍历目录下所有文件 for root, dirs, files in os.walk(main_folder): for zip_filename in files: # 筛选Zip文件(忽略大小写) if zip_filename.startswith("CSV_") and zip_filename.lower().endswith(".zip"): zip_path = os.path.join(root, zip_filename) # 读取Zip内的文件列表 with zipfile.ZipFile(zip_path, "r") as zip_ref: zip_file_list = zip_ref.namelist() # 查找_ident文件(忽略大小写) ident_file = next( (file for file in zip_file_list if file.lower().endswith("_ident.csv")), None ) if ident_file: # 提取公司名称:先去掉_ident.csv后缀,再移除日期前缀(如202306_) name_part = ident_file.rsplit("_ident.csv", 1)[0].lower() # 分割日期前缀和公司名部分 if "_" in name_part: company_name = name_part.split("_", 1)[1].upper() # 转回大写保持格式统一 else: company_name = name_part.upper() # 添加到结果列表 folder_file_info.append({ "Zip文件夹名称": zip_filename, "公司名称": company_name }) # 输出为Excel文件(优先) excel_path = "Zip与公司名关联目录.xlsx" df = pd.DataFrame(folder_file_info) df.to_excel(excel_path, index=False, encoding="utf-8") # 可选:同时输出CSV文件 csv_path = "Zip与公司名关联目录.csv" df.to_csv(csv_path, index=False, encoding="utf-8") print(f"文件已生成:\nExcel路径:{excel_path}\nCSV路径:{csv_path}")
代码说明
- 大小写兼容:通过
lower()统一转换为小写判断,避免因文件名大小写差异导致的匹配失败 - 准确提取公司名:先移除
_ident.csv后缀,再分割掉日期前缀(如202306_),仅保留公司名称部分 - Excel输出:使用
pandas直接生成Excel文件,满足优先需求,同时保留CSV输出选项 - 鲁棒性:添加了对日期前缀分割的容错处理,避免异常情况
内容的提问来源于stack exchange,提问作者SaveMyLifeCoder_123
相关产品推荐
相关产品推荐

