使用tempfile.TemporaryDirectory()残留空文件及邮件附件路径问题
问题解决:临时目录结合SMTP发邮件的空文件与附件找不到问题
问题分析
- 批处理目录残留空文件:初始代码中
df.to_csv(file_name, index=False)直接将文件写入当前工作目录,而非临时目录的attach_path,运行结束后该文件未被清理,因此留下空文件。 - 附件找不到错误:附件处理代码用
os.path.basename(path)打开文件,仅提取文件名后去当前工作目录查找,但文件实际存在于临时目录,导致路径匹配失败。
解决方案
1. 消除批处理目录的空文件
将df.to_csv()的目标路径改为临时目录下的attach_path,文件仅会生成在临时目录中,tempfile.TemporaryDirectory()的with语句结束后会自动删除整个临时目录,不会在批处理目录留下残留文件。
修正后的核心代码:
with tempfile.TemporaryDirectory() as temp: file_name = f"Risk_Report_{context}: {','.join(book)}_{risk_date}_{','.join(risk_measure)}.csv" subject = f"Success:Risk_Report_{context}:{','.join(book)}_{risk_date}_{','.join(risk_measure)}" email_body = '' attach_path = os.path.join(temp, file_name) df = pd.DataFrame(Risk.result_flatten(result_enrich)) # 写入临时目录的attach_path,而非当前目录的file_name df.to_csv(attach_path, index=False) table_html = df.to_html() email_body += f"{table_html}" # 发送邮件时传入完整的临时文件路径 messaging.send_email(subject, email_body, attachments=[attach_path])
2. 修复附件找不到的错误
修改附件处理代码,直接使用完整路径path打开文件,仅在设置附件显示名称时使用os.path.basename(path),既保证文件能被正确读取,又不影响附件的显示名称。
修正后的附件处理代码:
# 用完整路径path打开文件,确保找到临时目录中的文件 with open(path, 'rb') as f: part = MIMEApplication(f.read()) # 附件显示名称仍用basename,不改变用户看到的文件名 part.add_header('Content-Disposition', 'attachment', filename=os.path.basename(path)) msg.attach(part)
验证说明
- 修改后,批处理运行结束后临时目录会被自动清理,批处理目录不会再生成空文件。
- 附件处理时使用完整路径读取文件,能正确找到临时目录中的文件,邮件附件可正常发送和显示。
内容的提问来源于stack exchange,提问作者Alex Song
相关产品推荐
相关产品推荐

