[英]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.