如何使用Python从每日压缩Zip文件夹提取并重命名指定文件?
解决方案与学习指南
一、需求梳理
- 每日收到命名格式为
v1_csv_2022_06_02_2023_etc.zip的压缩包,需从内部export子文件夹中提取含sales、activity等指定关键词的4个CSV文件 - 解决同名文件覆盖问题:将压缩包中的日期(如
2022_06_02)添加到提取的CSV文件名前;最终合并所有sales类文件为一个主CSV文件
文件夹结构:
Users --> username --> documents --> sales & activities --> 带日期命名的每日Zip文件夹 --> export文件夹 --> 30+ CSV文件
二、改进后的代码实现
之前的代码会提取所有文件且未正确提取日期,下面是匹配需求的完整代码:
import os import zipfile import pandas as pd # 配置参数,根据你的实际情况修改 ZIP_DIR = "/Users/username/documents/sales & activities" # 存放每日zip包的文件夹路径 TARGET_KEYWORDS = ["sales", "activity"] # 需要提取的CSV文件名关键词 OUTPUT_DIR = os.path.join(ZIP_DIR, "processed_files") # 处理后文件的存放目录 MERGED_SALES_PATH = os.path.join(ZIP_DIR, "merged_sales.csv") # 合并后的主sales文件路径 # 创建输出目录,不存在则自动创建 os.makedirs(OUTPUT_DIR, exist_ok=True) # 遍历目录下所有zip文件 for zip_filename in os.listdir(ZIP_DIR): # 跳过非zip文件 if not zip_filename.endswith(".zip"): continue # 从zip文件名中提取日期部分(拆分后取第3-5段,对应YYYY_MM_DD) date_segments = zip_filename.split("_")[2:5] date_str = "_".join(date_segments) zip_full_path = os.path.join(ZIP_DIR, zip_filename) # 打开zip包,选择性提取文件 with zipfile.ZipFile(zip_full_path, "r") as zip_ref: # 遍历zip内的所有文件路径 for file_path_in_zip in zip_ref.namelist(): # 只处理export文件夹下的CSV文件,且文件名包含目标关键词 if file_path_in_zip.startswith("export/") and file_path_in_zip.endswith(".csv"): filename = os.path.basename(file_path_in_zip) if any(keyword in filename for keyword in TARGET_KEYWORDS): # 提取文件到输出目录 temp_extract_path = zip_ref.extract(file_path_in_zip, OUTPUT_DIR) # 重命名文件,添加日期前缀 new_filename = f"{date_str}_{filename}" new_file_path = os.path.join(OUTPUT_DIR, new_filename) os.rename(temp_extract_path, new_file_path) # 合并所有sales相关文件 sales_file_list = [f for f in os.listdir(OUTPUT_DIR) if "sales" in f and f.endswith(".csv")] data_frames = [] for sales_file in sales_file_list: full_file_path = os.path.join(OUTPUT_DIR, sales_file) # 读取CSV文件 df = pd.read_csv(full_file_path) # 添加来源日期列,方便后续溯源 df["source_date"] = "_".join(sales_file.split("_")[0:3]) data_frames.append(df) # 将所有sales数据合并并保存 if data_frames: merged_sales_df = pd.concat(data_frames, ignore_index=True) merged_sales_df.to_csv(MERGED_SALES_PATH, index=False) print(f"合并完成!主sales文件已保存到:{MERGED_SALES_PATH}") else: print("未找到任何需要合并的sales文件")
代码关键说明
- 参数配置:开头的变量都可以根据你的实际路径/需求修改,不用改动核心逻辑
- 日期提取:通过拆分zip文件名精准拿到日期部分,避免用整个zip名导致文件名过长
- 选择性提取:只处理符合条件的文件,减少不必要的磁盘占用
- 重命名规则:日期前缀确保同名文件不会覆盖,保留每日数据
- 合并逻辑:用Pandas合并数据,同时添加来源日期列,方便后续数据溯源
三、学习资源推荐
- Python基础:先掌握变量、循环、条件判断、文件操作,重点学
os模块的路径处理方法,这是批量操作文件的基础 - zipfile模块:查阅Python官方文档的zipfile章节,学习如何遍历压缩包内的文件、选择性提取内容
- Pandas数据处理:重点学习
read_csv、concat、to_csv这几个方法,掌握CSV文件的读取、合并、保存,这是处理这类数据需求的核心工具 - 实战练习:从简单的文件重命名、单个压缩包提取开始练,逐步过渡到批量处理、数据合并,积累实际操作经验
内容的提问来源于stack exchange,提问作者lunaliz
相关产品推荐
相关产品推荐

