You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用tempfile.TemporaryDirectory()残留空文件及邮件附件路径问题

问题解决:临时目录结合SMTP发邮件的空文件与附件找不到问题

问题分析

  1. 批处理目录残留空文件:初始代码中df.to_csv(file_name, index=False)直接将文件写入当前工作目录,而非临时目录的attach_path,运行结束后该文件未被清理,因此留下空文件。
  2. 附件找不到错误:附件处理代码用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 14:15:33