我有一个pandas数据框,我希望将其转换为xlsx并附加到电子邮件中。我可以根据outlook发送电子邮件(这是我能做到的唯一方法)。我能够将数据帧转换为xlsx并将其保存在我的驱动器上,然后将其作为附件发送,但我希望直接附加它而不必将其保存在我的驱动器上。请看下面我发送电子邮件的功能:
def email():
olMailItem = 0x0
obj = win32com.client.Dispatch("Outlook.Application")
newMail = obj.CreateItem(olMailItem)
newMail.Subject ="FRANCE SO"
newMail.Body =' '
newMail.To = "email adress"
newMail.Attachments.Add(attachment)
newMail.Send()
return
附件是已转换为xlsx的数据框
答案 0 :(得分:6)
您是否尝试过使用Python 3中的io
模块?它允许您将流用作类文件对象,以便期望文件的API可以读取或将其内容保存到流中。
使用StringIO
和pandas.DataFrame.to_csv
:
import io
def export_csv(df):
with io.StringIO() as buffer:
df.to_csv(buffer)
return buffer.getvalue()
这是有效的,因为to_csv
需要一个字符串(解释为路径)或文件句柄,而StringIO
可以像文件句柄一样使用。不幸的是,pandas.DataFrame.to_excel
适用于字符串(解释为路径)或ExcelWriter
。在这种情况下,我们需要自己创建ExcelWriter
,并用BytesIO
包裹它。
import io
import pandas as pd
def export_excel(df):
with io.BytesIO() as buffer:
writer = pd.ExcelWriter(buffer)
df.to_excel(writer)
writer.save()
return buffer.getvalue()
我不熟悉用于发送电子邮件的Outlook Python工具,我使用SMTP:
from email.mime.application import MIMEApplication
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
import smtplib
SEND_FROM = 'noreply@example.com'
EXPORTERS = {'dataframe.csv': export_csv, 'dataframe.xlsx': export_excel}
def send_dataframe(send_to, subject, body, df):
multipart = MIMEMultipart()
multipart['From'] = SEND_FROM
multipart['To'] = send_to
multipart['Subject'] = subject
for filename in EXPORTERS:
attachment = MIMEApplication(EXPORTERS[filename](df))
attachment['Content-Disposition'] = 'attachment; filename="{}"'.format(filename)
multipart.attach(attachment)
multipart.attach(MIMEText(body, 'html'))
s = smtplib.SMTP('localhost')
s.sendmail(SEND_FROM, send_to, multipart.as_string())
s.quit()
我希望这有帮助,祝你好运!