你還在做重複的勞動嗎?不如用Python自動生成Excel以郵件發送!

編程語言 Excel Python SQL 鏡音雙子 編程python新視野 2018-12-08
你還在做重複的勞動嗎?不如用Python自動生成Excel以郵件發送!

數據分析師小王每天都要被各種各樣的數據數據報表搞得焦頭爛額,比如老闆的,運營的、產品的等等。而且大部分報表都是重複性的工作。這篇文章就是幫助大家如何用Python來實現報表的自動發送,解放你的勞動力,可以讓你有時間去做更有意思的事情。

要點:

·pymysql 一個可以連接MySQL實例並且實現增刪改查功能的庫

·datetime Python標準庫中自帶的關於時間的庫

·openpyxl 一個可以讀寫07版以後的Excel文檔的庫

·smtplib SMTP即簡單郵件傳輸協議

·email 一個用來處理郵件消息的庫

對於初學者來說,可能有點難,不用擔心,小編專門有初學者的學習資料:關注,轉發,私信小編:“01”即可領取,希望對你們有幫助!

一.準備工作,導入相應的庫

數據分析師日常大部分工作需要熟練掌握SQL和excel打交道,而且很多數據都帶日期。所以我們需要導入下面這些模塊:

pymysql,openxl,datatime,當然還有自動發郵件的email和smtplib模塊。

# encoding=utf-8
import pymysql as pms
import openpyxl
import datetime
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
import smtplib

二.連接SQL

現在主流的數據庫有兩大類,SQL和NoSQL,雖然Mongodb非常靈活和簡單,但是大部分公司的數據庫還是用Mysql比較多的!所以我們需要掌握一些基本的python操作數據庫的知識!

1).執行一條sql,獲取數據

def get_datas(sql):
# 一個傳入sql導出數據的函數
# 跟數據庫建立連接
conn = pms.connect(host='實例地址', user='用戶',passwd='密碼',
database='庫名', port=3306,
charset="utf8")
# 使用 cursor() 方法創建一個遊標對象 cursor
cur = conn.cursor()
# 使用 execute() 方法執行 SQL
cur.execute(sql)
# 獲取所需要的數據
datas = cur.fetchall()
#關閉連接
cur.close()
#返回所需的數據
return datas

2).執行sql,獲取字段數據

def get_fields(sql):
# 一個傳入sql導出字段的函數
conn = pms.connect(host='rm-rj91p2yhl9dm2xmbixo.mysql.rds.xx.com', user='bi-analyzer',
passwd='xxx', database='xxx', port=3306, charset="utf8")
cur = conn.cursor()
cur.execute(sql)
# 獲取所需要的字段名稱
fields = cur.description
cur.close()
return fields

三.數據寫入Excel

用Python操作excel其實非常簡單,前面我們的入門教程裡有詳細的講解(關於Excel表格如何處理|這篇最用心)。用openpyxl建一個excel對象,然後建一個sheet,接著一個循環把一個一個單元格寫數據即可!

def get_excel(data, field, file):
# 將數據和字段名寫入excel的函數
#新建一個工作薄對象
new = openpyxl.Workbook()
#激活一個新的sheet
sheet = new.active
#給sheet命名
sheet.title = '數據展示'
#將字段名稱循環寫入excel第一行,因為字段格式列表裡包含列表,每個列表的第一元素才是字段名稱
for col in range(len(field)):
#row代表行數,column代表列數,value代表單元格輸入的值,行數和列數都是從1開始,這點於python不同要注意
_ = sheet.cell(row=1, column=col+1, value=u'%s' % field[col][0])
#將數據循環寫入excel的每個單元格中
for row in range(len(data)):
for col in range(len(field)):
#因為第一行寫了字段名稱,所以要從第二行開始寫入
_ = sheet.cell(row=row+2, column=col + 1, value=u'%s' % data[row][col])
#將生成的excel保存,這步是必不可少的
newworkbook = new.save(file)
#返回生成的excel
return newworkbook

四。處理日期數據

大部分的數據都是需要時間戳的,用Python操作時間可以用time,datatime這樣的模塊。

def getYesterday():
# 獲取昨天日期的字符串格式的函數
#獲取今天的日期
today = datetime.date.today()
#獲取一天的日期格式數據
oneday = datetime.timedelta(days=1)
#昨天等於今天減去一天
yesterday = today - oneday
#獲取昨天日期的格式化字符串
yesterdaystr = yesterday.strftime('%Y-%m-%d')
#返回昨天的字符串
return yesterdaystr

五.生成郵件

經過前面的幾個步驟,我們的準備工作差不多了!該重頭戲自動發送郵件出場了,編寫一個發送郵件,無非這麼幾步:

1).編寫郵件內容

def create_email(email_from, email_to, email_Subject, email_text, annex_path, annex_name):
# 輸入發件人暱稱、收件人暱稱、主題,正文,附件地址,附件名稱生成一封郵件
#生成一個空的帶附件的郵件實例
message = MIMEMultipart()
#將正文以text的形式插入郵件中
message.attach(MIMEText(email_text, 'plain', 'utf-8'))
#生成發件人名稱(這個跟發送的郵件沒有關係)
message['From'] = Header(email_from, 'utf-8')
#生成收件人名稱(這個跟接收的郵件也沒有關係)
message['To'] = Header(email_to, 'utf-8')
#生成郵件主題
message['Subject'] = Header(email_Subject, 'utf-8')
#讀取附件的內容
att1 = MIMEText(open(annex_path, 'rb').read(), 'base64', 'utf-8')
att1["Content-Type"] = 'application/octet-stream'
#生成附件的名稱
att1["Content-Disposition"] = 'attachment; filename=' + annex_name
#將附件內容插入郵件中
message.attach(att1)
#返回郵件
return message

用email模塊生成郵件的標題,內容,發件人和收件人。如果有附件的話,我們插入附件的文件。

2).發送郵件

準備好郵件的內容之後,我們用smtp模塊鏈接上服務器,填入用戶名和密碼。當然一定要有異常處理,所以涉及到服務器的處理,都需要有異常處理!

def send_email(sender, password, receiver, msg):
# 一個輸入郵箱、密碼、收件人、郵件內容發送郵件的函數
try:
#找到你的發送郵箱的服務器地址,已加密的形式發送
server = smtplib.SMTP_SSL("smtp.mxhichina.com", 465) # 發件人郵箱中的SMTP服務器
server.ehlo()
#登錄你的賬號
server.login(sender, password) # 括號中對應的是發件人郵箱賬號、郵箱密碼
#發送郵件
server.sendmail(sender, receiver, msg.as_string()) # 括號中對應的是發件人郵箱賬號、收件人郵箱賬號(是一個列表)、郵件內容
print("郵件發送成功")
server.quit() # 關閉連接
except Exception:
print(traceback.print_exc())
print("郵件發送失敗")

六.大功告成,看一下效果

忙活了半天,總於可以看一下運行的效果了!輸入一條sql查詢語句,然後初始化一些郵件的標題,然後填入一堆運營部門,產品部門的郵件地址。然後倒杯咖啡,漂亮的按一下回車,欣賞自己的勞動成果!

def main():
my_sql = sql = "SELECT a.id '用戶ID',\
a.gmtCreate '用戶註冊時間',\
af.lastLoginTime '最後登錄時間',\
af.totalBuyCount '歷史付款子單數',\
af.paidmountUSD '歷史付款金額',\
af.lastPayTime '用戶最後支付時間'\
FROM table a\
LEFT JOIN tableb af ON a.id= af.accountId ;"
# 生成數據
my_data = get_datas(my_sql)
# 生成字段名稱
my_field = get_fields(my_sql)
# 得到昨天的日期
yesterdaystr = getYesterday()
# 文件名稱
my_file_name = 'user attribute' + yesterdaystr + '.xlsx'
# 文件路徑
file_path = 'D:/work/report/' + my_file_name
# 生成excel
get_excel(my_data, my_field, file_path)
my_email_from = 'BI部門自動報表機器人'
my_email_to = '運營部'
# 郵件標題
my_email_Subject = 'user' + yesterdaystr
# 郵件正文
my_email_text = "Dear all,\n\t附件為每週數據,請查收!\n\nBI團隊 "
#附件地址
my_annex_path = file_path
#附件名稱
my_annex_name = my_file_name
# 生成郵件
my_msg = create_email(my_email_from, my_email_to, my_email_Subject,
my_email_text, my_annex_path, my_annex_name)
my_sender = '阿里雲郵箱'
my_password = '我的密碼'
my_receiver = [[email protected]']#接收人郵箱列表
# 發送郵件
send_email(my_sender, my_password, my_receiver, my_msg)
if __name__ == "__main__":
main();

看一下效果:

你還在做重複的勞動嗎?不如用Python自動生成Excel以郵件發送!

你還在做重複的勞動嗎?不如用Python自動生成Excel以郵件發送!

用Python寫自動化的小腳本小工具其實非常方便,快捷!比如今天的自動發郵件腳本,是通過郵件來發送的,對菜鳥來說可以練習,增強功力!

相關推薦

推薦中...