发送带有熊猫数据框作为附件的电子邮件

And*_*zma 5 python email pandas

我有一个熊猫数据框,希望将其转换为xlsx并附加到电子邮件中。我可以根据前景发送电子邮件(这是我唯一的方式)。我能够将数据帧转换为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
Run Code Online (Sandbox Code Playgroud)

附件是已转换为xlsx的数据框

sno*_*e92 6

您是否尝试过使用ioPython 3中的模块?它允许您将流用作类似文件的对象,以便期望文件的API可以读取流或将其内容保存到流中。

这工作得很好,利用StringIO沿pandas.DataFrame.to_csv

import io

def export_csv(df):
  with io.StringIO() as buffer:
    df.to_csv(buffer)
    return buffer.getvalue()
Run Code Online (Sandbox Code Playgroud)

这行得通,因为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()
Run Code Online (Sandbox Code Playgroud)

我不熟悉用于发送电子邮件的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()
Run Code Online (Sandbox Code Playgroud)

希望对您有帮助,祝您好运!