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

Python笔记本发Snowflake数据CSV附件邮件遇TypeError错误求助

解决Python导出CSV并邮件附件时的TypeError问题

错误原因分析

你遇到的TypeError: expected str, bytes or os.PathLike object, not NoneType,是因为pandas.DataFrame.to_csv()方法在传入文件名参数时,会直接将数据写入文件,返回值为None。你把这个返回值赋值给了message,后续open(message)相当于尝试打开一个None对象,自然触发错误。

修正方案及代码优化

下面是修复后的完整代码,同时解决了原代码中的其他潜在问题:

from datetime import date, timedelta
import numpy as np
import snowflake.connector
import pandas as pd
import statsmodels.api as sm
import statsmodels.tsa as tsa
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders

def main(days=31, offset=0):
    indices = ['country', 'statenumber', 'REPORTINGCOUNTRYSITENAME']
    bound_start = date.today() - pd.offsets.Week(offset, weekday=4)  
    bound_end = bound_start + timedelta(days=days)  

    data = query_snowflake()
    result = older_model(data, bound_start, bound_end)
    print(result)
        
    # 邮件配置
    mail_from = 'ABCD@company.com'
    mail_to = 'ABCD@company.com'
    gmailUser = "admin@company.com"  # 修正邮箱格式,原代码缺少.com后缀
    gmailPassword = "abcd1234"
    
    # 创建邮件主体
    msg = MIMEMultipart()
    msg['From'] = mail_from
    msg['To'] = mail_to
    msg['Subject'] = "Subject that is meaningful to the recipient"
    
    # 添加邮件正文
    mail_body = "Something happened in your databricks notebook"
    msg.attach(MIMEText(mail_body, 'plain'))
    
    # 保存CSV文件
    csv_filename = 'mydata.csv'  # 明确文件名,添加.csv后缀更规范
    result.to_csv(csv_filename, index=False)  # index=False避免把DataFrame索引写入CSV
    
    # 处理CSV附件
    with open(csv_filename, 'rb') as fp:
        part = MIMEBase('application', 'octet-stream')
        part.set_payload(fp.read())
    encoders.encode_base64(part)
    part.add_header('Content-Disposition', f'attachment; filename="{csv_filename}"')
    msg.attach(part)
 
    # 发送邮件
    try:
        mailServer = smtplib.SMTP('smtp.gmail.com', 587)
        mailServer.ehlo()
        mailServer.starttls()
        mailServer.ehlo()
        mailServer.login(gmailUser, gmailPassword)
        mailServer.send_message(msg)
        mailServer.close()
        print('Email sent!')
    except Exception as e:
        print(f'Something went wrong... Error: {str(e)}')  # 打印具体错误,方便排查

# 需确保以下两个函数已正确实现
def query_snowflake():
    # 补充你的Snowflake数据查询逻辑
    pass

def older_model(data, bound_start, bound_end):
    # 补充你的模型处理逻辑
    pass

关键修复点说明

  • CSV保存逻辑:直接使用明确的文件名调用to_csv,后续用该文件名打开文件,避免使用to_csv的返回值。
  • 附件类型修正:用MIMEBase处理二进制文件,设置正确的Content-Disposition头,确保邮件客户端识别为附件而非文本内容。
  • 添加邮件正文:原代码定义了mail_body但未附加到邮件,现在补充了这部分逻辑。
  • 错误信息优化:在异常捕获中打印具体错误内容,方便排查问题。
  • 模块清理:移除了重复导入的模块,代码更简洁。

内容的提问来源于stack exchange,提问作者bigdata techie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 07:53:18