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
相关产品推荐
相关产品推荐

