将指定文件夹中同日期CSV文件批量压缩为ZIP的问题求助
按日期批量打包CSV文件到ZIP的问题解决
错误原因
你的代码报错核心是路径处理不完整:
os.listdir(folder_name)返回的只是文件名,不是完整路径,直接用filename调用zipF.write时,程序会在当前工作目录查找文件,而非你指定的data文件夹,所以找不到目标CSV。- ZIP文件的保存路径未指定,默认会生成在当前工作目录,而非
data文件夹内,这也会导致后续找不到ZIP文件的问题。
修正后的代码
import os import zipfile from datetime import datetime def zip_csv_files(folder_name, date): date_to_string = date.strftime('%Y%m%d') # 构建ZIP文件的完整路径,确保生成在目标文件夹内 zipfile_path = os.path.join(folder_name, f'{date_to_string}_data.zip') with zipfile.ZipFile(zipfile_path, 'w') as zipF: for filename in os.listdir(folder_name): if filename.endswith('.csv') and date_to_string in filename: # 构建CSV文件的完整路径 csv_file_path = os.path.join(folder_name, filename) # arcname参数确保ZIP内只保留原文件名,而非完整路径 zipF.write(csv_file_path, arcname=filename, compress_type=zipfile.ZIP_DEFLATED) return zipfile_path # 调用示例:打包2023年9月14日的文件 target_date = datetime(2023, 9, 14) zip_csv_files(r'C:\users\data', target_date)
额外优化:自动识别所有日期并打包
如果不想手动传入日期,可以自动遍历所有CSV文件,提取日期并分组打包:
import os import zipfile from collections import defaultdict def auto_zip_by_date(folder_name): # 按日期分组存储CSV文件路径 date_files = defaultdict(list) for filename in os.listdir(folder_name): if filename.endswith('.csv'): # 提取文件名前8位作为日期(假设日期格式是YYYYMMDD) date_str = filename[:8] if date_str.isdigit() and len(date_str) ==8: csv_path = os.path.join(folder_name, filename) date_files[date_str].append(csv_path) # 遍历每个日期分组打包 for date_str, files in date_files.items(): zip_path = os.path.join(folder_name, f'{date_str}_data.zip') with zipfile.ZipFile(zip_path, 'w') as zipF: for file_path in files: # 只保留原文件名在ZIP内 zipF.write(file_path, arcname=os.path.basename(file_path), compress_type=zipfile.ZIP_DEFLATED) print(f'已生成ZIP文件:{zip_path}') # 调用示例 auto_zip_by_date(r'C:\users\data')
内容的提问来源于stack exchange,提问作者Amani
相关产品推荐
相关产品推荐

