如何修改Python代码下载邮件zip附件并提取其中的csv文件?
Python邮件ZIP附件下载及CSV提取修改方案
无需额外安装第三方依赖,使用Python内置的zipfile和io模块即可实现功能,原有检索发件人、主题的逻辑无需改动,仅修改附件处理部分即可
第一步:新增模块导入
在原有代码的导入部分增加如下内容:
import zipfile from io import BytesIO
第二步:修改附件处理逻辑
原有处理CSV附件的代码保留,新增ZIP格式附件的识别、读取、解压逻辑,核心代码片段如下:
# 此处保留你原有通过imap检索、匹配发件人/主题的全部逻辑 # 以下为匹配到目标邮件后的附件处理部分修改 for part in message.walk(): if part.get_content_disposition() == 'attachment': # 解码附件文件名,解决中文文件名乱码问题 filename = decode_header(part.get_filename())[0][0] if isinstance(filename, bytes): filename = filename.decode() # 新增ZIP附件处理分支 if filename.lower().endswith('.zip'): # 直接读取zip文件二进制内容,无需先落盘 zip_binary = part.get_payload(decode=True) with zipfile.ZipFile(BytesIO(zip_binary), 'r') as zip_obj: # 遍历压缩包内所有文件,只提取csv格式文件 for zip_file_item in zip_obj.namelist(): if zip_file_item.lower().endswith('.csv'): # 解压到指定本地目录,替换为你自己的保存路径即可 zip_obj.extract(zip_file_item, path='./target_save_dir') print(f"成功提取CSV文件:{zip_file_item}") # 原有CSV附件处理逻辑保留,兼容旧格式邮件 elif filename.lower().endswith('.csv'): save_path = os.path.join('./target_save_dir', filename) with open(save_path, 'wb') as f: f.write(part.get_payload(decode=True)) print(f"成功保存CSV附件:{filename}")
常见问题调整
- 若需要先保存ZIP压缩包到本地再解压,直接将
zip_binary写入本地.zip文件后,再传入zipfile.ZipFile读取本地文件路径即可 - 若ZIP包设置了解压密码,在
with代码块内新增一行zip_obj.setpassword(b'你的解压密码')即可 - 若解压后CSV文件名出现乱码,可尝试将
zip_file_item用gbk或cp437编码重新解码后重命名文件
内容的提问来源于stack exchange,提问作者Rich
相关产品推荐
相关产品推荐

