使用python解决烦人的每周邮件汇总!
最近开始接手BI工作,其中又一个繁琐又不得不做的事,就是每周五都得汇总上个财务周的数据给运营人员!
作为一个懒人,只能把这件事交由电脑去处理了。
初步的idea:周五11点前mac自动执行汇总程序->读取数据库数据->写入模版汇总excel->以邮件的形式发送给相关运营人员。
为了实现此idea并不考虑性能的情况下,选择了实用python这种简单且代码量少的方式。
首先先实现读取数据库数据部分
1.python_constant.py(常量部分,肯定要屏蔽具体信息啦,不然被公司投诉了!)
# -*- coding: utf-8 -*-
config_b2b = {
'user':'sqlbidev',
'password':'xxx',
'host':'xxx',
'database':'ODS_B2B'
}
config_b2c = {
'user':'sqlbidev',
'password':'xxx',
'host':'xxx',
'database':'ODS_B2C'
}
config_o2o = {
'user':'sqlbidev',
'password':'xxx',
'host':'xxx',
'database':'ODS_O2O'
}
data_b2c = {
'东北区域':'C6',
'海南区域':'C7',
'华北区域':'C8',
'华东区域':'C9',
'华南区域':'C10',
'山东区域':'C11',
'西北区域':'C12',
'中南区域':'C13'
}
data_o2o = {
'东北区域':'D6',
'海南区域':'D7',
'华北区域':'D8',
'华东区域':'D9',
'华南区域':'D10',
'山东区域':'D11',
'西北区域':'D12',
'中南区域':'D13'
}
data_b2b = {
'东北区域':'E6',
'海南区域':'E7',
'华北区域':'E8',
'华东区域':'E9',
'华南区域':'E10',
'山东区域':'E11',
'西北区域':'E12',
'中南区域':'E13'
}
2. python_query.py(查询数据,由于查三个库的数据,所以特定三个方法,简单实用!)
# -*- coding: utf-8 -*-
import pymssql
import python_constant as constant #读取b2c的会员数据
def query_b2c(start_time, end_time):
print('开始查询b2c数据')
conn = pymssql.connect(**constant.config_b2c)
cursor = conn.cursor(as_dict=True) sql = "select ds.FirstLevelRegion, COUNT(distinct consignee_mobile) ActiveMem from ( \
select * from openquery(B2C,'SELECT ord.* FROM tbl_order ord, tbl_seller ts \
WHERE ord.seller_no = ts.id AND ord.basic_state <> 404 AND DATE_FORMAT(ord.create_time, ''%Y%m%d'') between ''{0}'' and ''{1}'' ') ) ord \
inner join Dim_Store ds on ord.seller_no = ds.StoreId group by ds.FirstLevelRegion".format(start_time, end_time)
cursor.execute(sql)
result = [row for row in cursor]
conn.close()
print('结束查询b2c数据')
return result #读取o2o的会员数据
def query_o2o(start_time, end_time):
print('开始查询o2o数据')
conn = pymssql.connect(**constant.config_o2o)
cursor = conn.cursor(as_dict=True) sql = "select ds.FirstLevelRegion, COUNT(distinct buyer_phone) ActiveMem from ( \
select * from openquery(O2O, 'SELECT tod.* FROM tbl_order tod,tbl_outlet_basic_info tobi WHERE 1 = 1 AND tod.outlet_id = tobi.outlet_id \
AND DATE_FORMAT(tod.create_time, ''%Y%m%d'') between ''{0}'' and ''{1}'' ') ) ord \
inner join Dim_Store ds on ord.outlet_id = ds.StoreId group by ds.FirstLevelRegion".format(start_time, end_time)
cursor.execute(sql)
result = [row for row in cursor]
conn.close()
print('结束查询o2o数据')
return result #读取b2b的会员数据
def query_b2b(start_time, end_time):
print('开始查询b2b数据') conn = pymssql.connect(**constant.config_b2b)
cursor = conn.cursor(as_dict=True) sql = "select ds.FirstLevelRegion, COUNT(distinct contact_mobile) ActiveMem from ( \
select * from openquery(B2B, 'SELECT * FROM order_info tod\
where DATE_FORMAT(tod.create_time, ''%Y%m%d'') between ''{0}'' and ''{1}'' ') ) ord \
inner join Dim_Store ds on ord.supply_user_code = ds.StoreId \
group by ds.FirstLevelRegion".format(start_time, end_time)
cursor.execute(sql)
result = [row for row in cursor]
conn.close()
print('结束查询b2b数据')
return result
3. 实现发送email邮件
#!/usr/bin/env python3
#coding: utf-8
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.header import Header sender = 'll-chen6@hnair.com'
receiver = 'chenqianyun@ccoop.com.cn'
subject = '每周会员统计数'
smtpserver = 'smtp.hnair.com'
username = 'xxxx'
password = 'xxxx' def send(path):
msg = MIMEText('<html><h1>倩云,你好!汇总数据请查收附件</h1></html>','html','utf-8') msgRoot = MIMEMultipart('related')
msgRoot['Subject'] = Header(subject, 'utf-8') title = '每周会员统计数.xlsx'.decode('utf-8') #构造附件
att = MIMEText(open(path, 'rb').read(), 'base64', 'utf-8')
att["Content-Type"] = 'application/octet-stream'
att["Content-Disposition"] = 'attachment; filename=%s' %title.encode('gb2312') msgRoot.attach(msg)
msgRoot.attach(att) smtp = smtplib.SMTP()
smtp.connect(smtpserver)
smtp.login(username, password)
smtp.sendmail(sender, receiver, msgRoot.as_string())
smtp.quit()
5. 主体调用
# -*- coding: utf-8 -*-
from openpyxl import Workbook
from openpyxl import load_workbook
import python_query as query
import python_email as email
import time
import datetime
import python_constant as constant #date_time = datetime.datetime.now()
date_time = datetime.datetime(2017, 2, 28)
dayOfWeek = date_time.weekday()
#假如是星期五则执行查询
if dayOfWeek == 4:
start_date = date_time + datetime.timedelta(-27)
end_time = date_time.strftime("%Y%m%d")
start_time = start_date.strftime("%Y%m%d")
print "开始时间:{0}, 结束时间:{1}".format(start_time, end_time)
#获取当前月份
month = date_time.month
#获取统计周
query_day = start_date.strftime("%m.%d") + '-' + date_time.strftime("%m.%d")
wb = load_workbook('/Users/chenlili/Desktop/BI立项/汇报数据模版/第3周活跃会员数.xlsx')
sheet = wb.get_sheet_by_name(u'Sheet1')
sheet['B2'] = str(month) + '月'
sheet['B4'] = query_day #填充b2c数据
b2c_result = query.query_b2c(start_time, end_time)
if b2c_result:
for data in b2c_result:
first_level_region = data['FirstLevelRegion'].encode('utf-8')
row = constant.data_b2c[first_level_region]
print first_level_region + ', ' + str(data['ActiveMem'])
if row:
sheet[row] = data['ActiveMem']
#填充o2o数据
o2o_result = query.query_o2o(start_time, end_time)
if o2o_result:
for data in o2o_result:
first_level_region = data['FirstLevelRegion'].encode('utf-8')
row = constant.data_o2o[first_level_region]
print first_level_region + ', ' + str(data['ActiveMem'])
if row:
sheet[row] = data['ActiveMem'] #填充b2b数据
try:
b2b_result = query.query_b2b(start_time, end_time)
if b2b_result:
for data in b2b_result:
first_level_region = data['FirstLevelRegion'].encode('utf-8')
row = constant.data_b2b[first_level_region]
print first_level_region + ', ' + str(data['ActiveMem'])
if row:
sheet[row] = data['ActiveMem']
except Exception, e:
print '异常错误: ' + str(e)
else:
pass
finally:
print '解除异常继续执行' path = '/Users/chenlili/Desktop/BI立项/汇报数据模版/第3周活跃会员数副本.xlsx'
wb.save(path) #发送邮件
email.send(path)
else:
print "未到星期五!"
完结,提供github上的代码:friday_task,暂时未实现自动执行脚本的shell,还在想怎么实现。
使用python解决烦人的每周邮件汇总!的更多相关文章
- Jmeter之解决烦人的中文乱码问题
Jmeter是一款国外开源工具,所以就跟LR一样,对中文的支持不是很好,经常会有同学录制脚本后回放或者是发送HTTP请求,看到响应报文里面有乱码! 那如何才能解决这个问题呢?我们分2个情况来分析: 一 ...
- win7下解决烦人的管理员权限问题
禁不住诱惑,用上win7了.可是,对system下的文件进行编辑时候,老是碰到什么必须拥有管理员权限才能进行操作,删除文件或者文件夹也遇到一样的问题.我就纳闷了,我不就是超级管理员吗?我怎么就没有权限 ...
- python中烦人的锟斤拷(\xef\xbf\xbd)
首先要知道\xef\xbf\xbd是啥东西 >>> u'\uFFFD'.encode('utf-8') '\xef\xbf\xbd' 由此我们可以知道\xef\xbf\xbd是utf ...
- 使用call、apply和bind解决js中烦人的this,事件绑定时的this和传参问题
1.什么是this 在JavaScript中this可以是全局对象.当前对象或者任意对象,这完全取决于函数的调用方式,this 绑定的对象即函数执行的上下文环境(context). 为了帮助理解,让我 ...
- 【python】脚本连续发送QQ邮件
今天习得用python写一个连续发送QQ邮件的脚本,经过测试,成功给国内外的服务器发送邮件,包括QQ邮箱.163邮箱.google邮箱,香港科技大学的邮箱和爱丁堡大学的邮箱.一下逐步解答相关技巧. 首 ...
- 〖Linux〗干掉Kubuntu烦人的软件升级提示“Update notification daemon”,Your should update ..
Kubuntu是很好使用,但是升级提示也是太烦人了,开机的时候总是显示如下画面: 使用System Load Indicator(sudo apt-get install indicator-mult ...
- 条目六《当心C++编译器中最烦人的分析机制》
当心C++编译器中最烦人的分析机制 C++是较为底层的面相对象语言,在底层的语法规则分析中,有很多隐藏的分析机制. C++中的普遍规律相符,即尽可能地解释为函数声明. 把形式参数的声明用括号括起来是非 ...
- 【转】【Stackoverflow好问题】去掉烦人的“!=null"(判空语句)
[Stackoverflow好问题]去掉烦人的“!=null"(判空语句) 问题 为了避免空指针调用,我们经常会看到这样的语句 ...if (someobject != null) { ...
- 使用 Envoy 和 AdGuard Home 阻挡烦人的广告
原文链接:使用 Envoy 和 AdGuard Home 阻挡烦人的广告 通常我们使用网络时,宽带运营商会为我们分配一个 DNS 服务器.这个 DNS 通常是最快的,距离最近的服务器,但会有很多问题, ...
随机推荐
- java基础23 Math类和Random类
一.Math数学类 主要是提供很多数学的公式 1.1.Math类的常用方法 abs(int a):绝对值 ceil(double a):向上取整 floor(double a):向下取整 ...
- Codeforces 963A Alternating Sum(等比数列求和+逆元+快速幂)
题目链接:http://codeforces.com/problemset/problem/963/A 题目大意:就是给了你n,a,b和一段长度为k的只有'+'和‘-’字符串,保证n+1被k整除,让你 ...
- 20165333 2016-2017-2 《Java程序设计》第1周学习总结
20165333 2016-2017-2 <Java程序设计>第1周学习总结 教材学习内容总结 java 的地位 Java 的特点 安装JDK 系统环境的设置 Java程序的编写,编译和运 ...
- Retrofit + RxJava + OkHttp 让网络请求变的简单-基础篇
https://www.jianshu.com/p/5bc866b9cbb9 最近因为手头上的工作做完了,比较闲,想着做一些优化.看到以前用的那一套网络框架添加一个请求比较麻烦,并且比较难用,所以想改 ...
- bzoj 2756
2756 思路: 二分讨论,网络流检验: 代码: #include <bits/stdc++.h> using namespace std; #define INF 1e16 #defin ...
- USACO 5.3 Big Barn
Big BarnA Special Treat Farmer John wants to place a big square barn on his square farm. He hates to ...
- 基于 Struts2 的单文件和多文件上传
文件的上传下载是 Web 开发中老生常谈的功能,基于 Struts2 框架对于实现这一功能,更是能够给我们带来很多的便利.Struts2 已经有默认的 upload 拦截器.我们只需要写参数,它就会自 ...
- HTML5 Canvas游戏开发(四)lufylegend开源库件(下)
一.文本 LTextField对象是lufylegend库件中专门用于显示文本信息的一个对象. 1.文本属性 创建的文本框对象不会自动加入可视化对象列表中.只有手动调用addChild()方法才能使它 ...
- TestNG入门到...
目录 一.概述 二.@Test注解常用参数 三.测试中常用的断言(assert) 四.TestNG常用注解及使用 五.配置文件xml常用标签 六.参数传递 七.测试报告 一.概述 1.TestNG是一 ...
- mysql proxy代理安装和配置
mysql proxy代理安装和配置 服务器说明: 192.168.1.219 mysql主库(主从复制) 192.168.1.177 mysql从库(主从复制) 192.168.1.202 ...