簡體   English   中英

如何從 df 創建表並存儲數據以發送郵件?

[英]How to create a table and store data from df to send mails?

我需要將我的 sql 表數據添加到 email 正文並將其發送給所需方。 所以我使用了以下方法。

db_connection = sql.connect(host='', database='term_data', user='root', password='',charset='utf8')
cursor = db_connection.cursor()
raw_data_query =  "select * from terminationdata where Name = 'X1' order by Date desc limit 7"
df = pd.read_sql(raw_data_query, db_connection)

然后我將所有 output 添加到如下變量中。

row_Name=[]
row_Date=[]
row_calls=[]
row_ans=[]
row_min=[]
for index, row in df.iterrows():
    print(row['Date'], row['Calls'], row['Answered_Calls'], row['Total_Minutes'])
    row_Date.append(row['Date'])
    row_calls.append(row['Calls'])
    row_ans.append(row['Answered_Calls'])
    row_min.append(row['Total_Minutes'])
   

由於這些數據類型是一個列表,我將它們轉換為 str 值。

row_Date_str = '\n'.join(row_Date)
row_calls_str = '\n'.join(map(str, row_calls))
row_ans_str = '\n'.join(map(str, row_ans))
row_min_str = '\n'.join(map(str, row_min))

最后我把 email 主體做成了一個表格並組合起來。

<table>
        <tr>
            
            <td><b>Date</b></td>
            <td><b>Calls</b></td>
            <td><b>Answered_Calls</b></td>
            <td><b>Total_Minutes</b></td>
        </tr>
        <tr>
            
            <td>"""+row_Date_str+"""</td>
            <td>"""+row_calls_str+"""</td>
            <td>"""+row_ans_str+"""</td>
            <td>"""+row_min_str+"""</td>
        </tr>
    </table><br/><br/>

它工作正常,但問題是我沒有為每組獲取新行。所有數據都在下面的同一個單元格中。

在此處輸入圖像描述

有人可以告訴我我在哪里搞砸了嗎?

這就是我過去發送電子郵件的方式。

import smtplib

sender = 'st@xyz.com'
receivers = ['s@xyz.com']

message = """From: ST <st@xyz.com>
To: SS <s@xyz.com> ; 
MIME-Version: 1.0
Content-type: text/html
Subject: """+mailsubject+"""

Dear All,<br/><br/> Please refer below termination data  :<br/><br/>

D1: <br/>
<table>
        <tr>
            
            <td><b>Date</b></td>
            <td><b>Calls</b></td>
            <td><b>Answered_Calls</b></td>
            <td><b>Total_Minutes</b></td>
        </tr>
        <tr>
            
            <td>"""+row_Date_str+"""</td>
            <td>"""+row_calls_str+"""</td>
            <td>"""+row_ans_str+"""</td>
            <td>"""+row_min_str+"""</td>
        </tr>
    </table><br/><br/>
    

    




<b>This is an automated email, Please do not reply ...</b>
"""

try:
   smtpObj = smtplib.SMTP('Xc.outlook.com',25)
   smtpObj.sendmail(sender, receivers, message)         
   print ("Successfully sent email")
except smtplib.SMTPException:
   print ("Error: unable to send email")

您需要在其中創建帶有<td>的新<tr>以使其按您希望的方式工作,您的問題不是 Python 代碼,而是您使用 HTML 的方式。

您會看到值之間的空格,因為 HTML 將"\n"呈現為簡單的空格,實際上任何空格都會減少為單個空格。

<tr>也代表 Table Row,如果您想要多行顯示數據,您需要為表中的每一行創建一個新的<tr>元素。

這是我的做法:

def table_row(date, calls, ans, min):
    return f"""
        <tr>
        <td>{date}</td>
        <td>{calls}</td>
        <td>{ans}</td>
        <td>{min}</td>
        </tr>
    """


table_rows = []

for index, row in df.iterrows():
    table_rows.append(
        table_row(
            date=row['Date'],
            calls=row['Calls'],
            ans=row['Answered_Calls'],
            date=row['Total_Minutes'],
        )
    )

table_rows_str = "\n".join(table_rows)

message = f"""
<table>
        <tr>
            
            <td><b>Date</b></td>
            <td><b>Calls</b></td>
            <td><b>Answered_Calls</b></td>
            <td><b>Total_Minutes</b></td>
        </tr>
        {table_rows_str}
    </table><br/><br/>
"""

請注意,我也沒有不必要地遍歷 dataframe:您可以在遍歷數據本身時創建表行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM