自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

我用Python自動生成報表以郵件發(fā)送,減輕了我的工作壓力

開發(fā) 后端
數(shù)據(jù)分析師肯定每天都被各種各樣的數(shù)據(jù)數(shù)據(jù)報表搞得焦頭爛額,老板的,運營的、產(chǎn)品的等等。而且大部分報表都是重復性的工作,這篇文章就是幫助大家如何用Python來實現(xiàn)報表的自動發(fā)送,解放你的勞動力,可以讓你有時間去做更有意思的事情。

數(shù)據(jù)分析師肯定每天都被各種各樣的數(shù)據(jù)數(shù)據(jù)報表搞得焦頭爛額,老板的,運營的、產(chǎn)品的等等。而且大部分報表都是重復性的工作,這篇文章就是幫助大家如何用Python來實現(xiàn)報表的自動發(fā)送,解放你的勞動力,可以讓你有時間去做更有意思的事情。

首先來介紹下實現(xiàn)自動報表要使用到的Python庫:

  • pymysql 一個可以連接MySQL實例并且實現(xiàn)增刪改查功能的庫
  • datetime Python標準庫中自帶的關于時間的庫
  • openpyxl 一個可以讀寫07版以后的Excel文檔(.xlsx格式也支持)的庫
  • smtplib SMTP即簡單郵件傳輸協(xié)議,Python簡單封裝成了一個庫
  • email 一個用來處理郵件消息的庫

為什么使用openpyxl庫來處理Excel呢?因為它支持每個sheet的行數(shù)為100W+,也是支持xlsx格式的文件。如果你接受xls文件,并且每個sheet的行數(shù)小于6W,也是可以使用xlwt庫,它對大文件的讀取速度要大于openpyxl。

接下來我們就進入實戰(zhàn)部分,來正式實現(xiàn)這個過程。我把整個實現(xiàn)過程分成幾個函數(shù)的方式來實現(xiàn),這樣看著會比較有結構感。

一、首先導入所有要用到的庫

  1. # encoding=utf-8 
  2. import pymysql as pms 
  3. import openpyxl 
  4. import datetime 
  5. from email.mime.text import MIMEText 
  6. from email.mime.multipart import MIMEMultipart 
  7. from email.header import Header 
  8. import smtplib 

二、 編寫一個傳入sql就返回數(shù)據(jù)的函數(shù)get_datas(sql)

  1. def get_datas(sql): 
  2.  # 一個傳入sql導出數(shù)據(jù)的函數(shù) 
  3.  # 跟數(shù)據(jù)庫建立連接 
  4.  conn = pms.connect(host='實例地址'user='用戶'
  5.  passwd='密碼'database='庫名', port=3306, charset="utf8"
  6.  # 使用 cursor() 方法創(chuàng)建一個游標對象 cursor 
  7.  cur = conn.cursor() 
  8.  # 使用 execute() 方法執(zhí)行 SQL 
  9.  cur.execute(sql) 
  10.  # 獲取所需要的數(shù)據(jù) 
  11.  datas = cur.fetchall() 
  12.  #關閉連接 
  13.  cur.close() 
  14.  #返回所需的數(shù)據(jù) 
  15.  return datas 

三、 編寫一個傳入sql就返回數(shù)據(jù)的字段名稱的函數(shù)get_datas(sql),因為一個函數(shù)只能返回一個值,這邊就用2個函數(shù)來分別返回數(shù)據(jù)和字段名稱(也就是excel里的表頭)

  1. def get_fields(sql): 
  2.  # 一個傳入sql導出字段的函數(shù) 
  3.  conn = pms.connect(host='rm-rj91p2yhl9dm2xmbixo.mysql.rds.aliyuncs.com'user='bi-analyzer'
  4.  passwd='pcNzcKPnn'database='kikuu', port=3306, charset="utf8"
  5.  cur = conn.cursor() 
  6.  cur.execute(sql) 
  7.  # 獲取所需要的字段名稱 
  8.  fields = cur.description 
  9.  cur.close() 
  10.  return fields 

四、 編寫一個傳入數(shù)據(jù)、字段名稱、存儲地址返回一個excel 的函數(shù)et_excel(data, field, file)

  1. def get_excel(data, field, file): 
  2.  # 將數(shù)據(jù)和字段名寫入excel的函數(shù) 
  3.  #新建一個工作薄對象 
  4.  new = openpyxl.Workbook() 
  5.  #激活一個新的sheet 
  6.  sheet = new.active 
  7.  #給sheet命名 
  8.  sheet.title = '數(shù)據(jù)展示' 
  9.  #將字段名稱循環(huán)寫入excel***行,因為字段格式列表里包含列表,每個列表的***元素才是字段名稱 
  10.  for col in range(len(field)): 
  11.  #row代表行數(shù),column代表列數(shù),value代表單元格輸入的值,行數(shù)和列數(shù)都是從1開始,這點于python不同要注意 
  12.  _ = sheet.cell(row=1, column=col+1, value=u'%s' % field[col][0]) 
  13.  #將數(shù)據(jù)循環(huán)寫入excel的每個單元格中  
  14.  for row in range(len(data)): 
  15.  for col in range(len(field)): 
  16.  #因為***行寫了字段名稱,所以要從第二行開始寫入 
  17.  _ = sheet.cell(row=row+2, column=col + 1, value=u'%s' % data[row][col]) 
  18.  #將生成的excel保存,這步是必不可少的 
  19.  newworkbook = new.save(file) 
  20.  #返回生成的excel 
  21.  return newworkbook 

五、 編寫一個自動獲取昨天日期字符串格式的函數(shù)getYesterday()

  1. def getYesterday(): 
  2.  # 獲取昨天日期的字符串格式的函數(shù) 
  3.  #獲取今天的日期 
  4.  today = datetime.date.today() 
  5.  #獲取一天的日期格式數(shù)據(jù) 
  6.  oneday = datetime.timedelta(days=1) 
  7.  #昨天等于今天減去一天 
  8.  yesterday = today - oneday 
  9.  #獲取昨天日期的格式化字符串 
  10.  yesterdaystr = yesterday.strftime('%Y-%m-%d'
  11.  #返回昨天的字符串 
  12.  return yesterdaystr 

六、編寫一個生成郵件的函數(shù)create_email(email_from, email_to, email_Subject, email_text, annex_path, annex_name)

  1. def create_email(email_from, email_to, email_Subject, email_text, annex_path, annex_name): 
  2.  # 輸入發(fā)件人昵稱、收件人昵稱、主題,正文,附件地址,附件名稱生成一封郵件 
  3.  #生成一個空的帶附件的郵件實例 
  4.  message = MIMEMultipart() 
  5.  #將正文以text的形式插入郵件中 
  6.  message.attach(MIMEText(email_text, 'plain''utf-8')) 
  7.  #生成發(fā)件人名稱(這個跟發(fā)送的郵件沒有關系) 
  8.  message['From'] = Header(email_from, 'utf-8'
  9.  #生成收件人名稱(這個跟接收的郵件也沒有關系) 
  10.  message['To'] = Header(email_to, 'utf-8'
  11.  #生成郵件主題 
  12.  message['Subject'] = Header(email_Subject, 'utf-8'
  13.  #讀取附件的內容 
  14.  att1 = MIMEText(open(annex_path, 'rb').read(), 'base64''utf-8'
  15.  att1["Content-Type"] = 'application/octet-stream' 
  16.  #生成附件的名稱 
  17.  att1["Content-Disposition"] = 'attachment; filename=' + annex_name 
  18.  #將附件內容插入郵件中 
  19.  message.attach(att1) 
  20.  #返回郵件 
  21.  return message 

七、 生成一個發(fā)送郵件的函數(shù)send_email(sender, password, receiver, msg)

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

八、建立一個main函數(shù),把所有的自定義內容輸入進去,***執(zhí)行main函數(shù)

  1. def main(): 
  2.  print(datetime.datetime.now()) 
  3.  my_sql = sql = "SELECT a.id '用戶ID'
  4.  a.gmtCreate '用戶注冊時間'
  5.  af.lastLoginTime '***登錄時間'
  6.  af.totalBuyCount '歷史付款子單數(shù)'
  7.  af.paidmountUSD '歷史付款金額'
  8.  af.lastPayTime '用戶***支付時間' 
  9.  FROM table a 
  10.  LEFT JOIN tableb af ON a.id= af.accountId ;" 
  11.  # 生成數(shù)據(jù) 
  12.  my_data = get_datas(my_sql) 
  13.  # 生成字段名稱 
  14.  my_field = get_fields(my_sql) 
  15.  # 得到昨天的日期 
  16.  yesterdaystr = getYesterday() 
  17.  # 文件名稱 
  18.  my_file_name = 'user attribute' + yesterdaystr + '.xlsx' 
  19.  # 文件路徑 
  20.  file_path = 'D:/work/report/' + my_file_name 
  21.  # 生成excel 
  22.  get_excel(my_data, my_field, file_path) 
  23.  my_email_from = 'BI部門自動報表機器人' 
  24.  my_email_to = '運營部' 
  25.  # 郵件標題 
  26.  my_email_Subject = 'user' + yesterdaystr 
  27.  # 郵件正文 
  28.  my_email_text = "Dear all
  29.     附件為每周數(shù)據(jù),請查收! 
  30.  
  31. BI團隊 " 
  32.  #附件地址 
  33.  my_annex_path = file_path 
  34.  #附件名稱 
  35.  my_annex_name = my_file_name 
  36.  # 生成郵件 
  37.  my_msg = create_email(my_email_from, my_email_to, my_email_Subject, 
  38.  my_email_text, my_annex_path, my_annex_name) 
  39.  my_sender = '阿里云郵箱' 
  40.  my_password = '我的密碼' 
  41.  my_receiver = [10001@qq.com']#接收人郵箱列表 
  42.  # 發(fā)送郵件 
  43.  send_email(my_sender, my_password, my_receiver, my_msg) 
  44.  print(datetime.datetime.now()) 
  45. if __name__ == "__main__"
  46.  main();  

 

責任編輯:龐桂玉 來源: 今日頭條
相關推薦

2021-05-11 05:04:21

Python錄取通知書

2010-06-01 10:57:47

職場人抑郁

2020-01-16 15:42:54

五福Python交互

2020-06-12 09:07:03

技術總監(jiān)數(shù)據(jù)庫

2023-12-06 11:10:08

2024-06-03 11:43:55

2021-12-02 06:34:34

GraylogELK日志

2021-12-03 10:46:49

ELKGraylog運維

2017-09-05 09:38:12

2017-03-23 10:42:05

Pythonjava開發(fā)

2022-06-10 13:40:44

CISO首席信息安全官

2017-06-05 08:55:27

Python起源應用

2019-11-19 11:29:50

Python數(shù)據(jù)標系

2009-10-13 14:49:00

工作求職之路

2022-08-17 11:20:23

Python微信

2021-08-09 08:24:08

時間工作生活

2014-06-27 18:22:19

2019-04-28 11:48:54

Python面試工程師

2020-02-06 11:30:08

代碼JavaScript&&

2013-07-17 14:13:08

產(chǎn)品產(chǎn)品失敗
點贊
收藏

51CTO技術棧公眾號