Python 每日定时查询数据库生成Excel报表,并群发邮件

最近在做游戏打点数据的一些统计处理,写了个Python脚本完成每日定时自动查询生成Excel报表并群发邮件的小功能。

拆解几个需求点:

一.连接数据库并查询

以下是一个查询总注册人数的示例代码,host port db user password等填入自己数据库的参数。

mysql就不多说了,根据统计需求自己撸吧

import pymysqlhost = 'xxxx'
port = xxx
db = 'xxx'
user = 'xxx'
password = 'xxx'# ---- 用pymysql 操作数据库
def get_connection():conn = pymysql.connect(host=host, port=port, db=db, user=user, password=password)return connconn = get_connection()# 使用 cursor() 方法创建一个 dict 格式的游标对象 cursor
cursor = conn.cursor(pymysql.cursors.DictCursor)#总注册
cursor.execute("select count(distinct userId) as total from Statistics where ops = 'register' ")
data = cursor.fetchone()
allTotalRegisterNum = data['total']
print("-- 总注册人数: %s " % (data['total']))

二.查询的数据生成Excel报表

以下为统计关卡数据并生成Excel的小例子,startPersonNum,finishPersonNum,ratio都是之前查库处理好的数据,生成的Excel名称为 地区+数据统计+日期,region为统计的地区,yesterday为昨天日期

import xlwt
workbook = xlwt.Workbook(encoding = 'ascii')
worksheet = workbook.add_sheet('关卡数据')#关卡统计数据
print("-- 开始关卡数据统计 -- ")
worksheet.col(1).width = 3000
worksheet.col(2).width = 3000
worksheet.col(3).width = 3000
worksheet.write(0, 1, "开始关卡人数") 
worksheet.write(0, 2, "结束关卡人数") 
worksheet.write(0, 3, "单关完成率") 
worksheet.write(i, 1, startPersonNum) 
worksheet.write(i, 2, finishPersonNum) 
worksheet.write(i, 3, ratio) workbook.save("%s_数据统计_%s.xls" % (region, str(yesterday))) # 保存文件

三.发送邮件

sender 发送发,receivers 接收方数组,         mail_host 邮件服务器,mail_user="xxx"    #用户名
 mail_pass="xxx"   #口令 

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
from email.mime.base import MIMEBase
from email import encoderssender = 'xxx.com'
receivers = ['xxx.com','xxx2.com']  # 接收邮件,可设置为你的QQ邮箱或者其他邮箱def SendEmail(): # 今天日期today = datetime.date.today() # 昨天时间yesterday = today - datetime.timedelta(days=1)for receiver in receivers:#创建一个带附件的实例message = MIMEMultipart()message['From'] = sendermessage["To"] = receiversubject = '%s数据统计'%(str(yesterday))message['Subject'] = '%s数据统计'%(str(yesterday))#邮件正文内容message.attach(MIMEText('%s数据统计'%(str(yesterday)), 'plain', 'utf-8'))for channel in channels:if(os.path.exists("%s_数据统计_%s.xls"%(region, str(yesterday)))):        att1 = MIMEBase('application', "octet-stream")att1.set_payload(open("%s_数据统计_%s.xls"%(channel, str(yesterday)),'rb').read())encoders.encode_base64(att1)att1.add_header('Content-Disposition', 'attachment; filename="%s-%s.xls"'%(channel, str(yesterday)))message.attach(att1)try:# 第三方 SMTP 服务mail_host="smtp.yeah.net"  #设置服务器mail_user="xxx"    #用户名mail_pass="xxx"   #口令 smtpObj = smtplib.SMTP()smtpObj.connect(mail_host,25)    # 25 为 SMTP 端口号smtpObj.login(mail_user, mail_pass)  smtpObj.sendmail(sender, [receiver], message.as_string())print("邮件发送成功")except smtplib.SMTPException as e:print("Error: 无法发送邮件%s"% e)

四.定时功能

以下为每日1点启动发送邮件函数的例子

from apscheduler.schedulers.blocking import BlockingSchedulerdef job():SendEmail()def start():# BlockingSchedulerscheduler = BlockingScheduler()scheduler.add_job(job, 'cron', day_of_week='0-6', hour=1, minute=00)scheduler.start()if __name__ == '__main__':start()  

五.几个坑

1.数据库连接超时。

代码如果运行在国内本机,连接海外服务器数据库的话是很容易超时的,可以将代码布置到服务器上或者挂VP

2.发送邮件代码中的Password

不是邮箱的密码,是邮箱的授权码,是邮箱的授权码,是邮箱的授权码。重要的事情说三遍。授权码去自己的发送方邮箱里设置获取

3.邮件附件的命名

命名不能有乱七八糟的字符,否则会发现贴到邮件中是bin文件

完整示例代码git地址: git@github.com:Dejavu0709/Statistics.git

发送邮件常见问题参考链接:Python发送邮件smtplib.SMTP各报错问题的解决方法_DearMorning的博客-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/246058.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

com口驱动_Ubuntu 安装Nvidia显卡驱动指南

该文档适用于: Ubuntu 14/16/18 三个版本。Nvidia显卡驱动适用于:RTX2080TI/RTX2080/RTX2070/GTX1080TI/GTX1080/GTX1070以及更低级别显卡。本文档旨在帮助大家解决安装Nvidia显卡遇到的常见问题。Nvidia驱动下载地址:https://www.geforce.co…

Unity URP中根据深度重建世界坐标

通过深度值重建世界坐标,可以做出很多有意思的后处理效果,先实现下度值重建世界坐标这个功能。 一.验证重建效果 首先,得先找到一种证明反推回世界空间位置正确的方法。在相机前摆放几个物体,尽量使之在世界坐标下的位置小于1&a…

dubbo yml配置_Spring boot 的profile功能如何实现多环境配置自动切换

通常服务端应用开发需要经过以下几个流程:开发 -> 测试 -> RC验证 -> 上线这就涉及到四个不同的环境,开发环境、测试环境、RC环境以及生产环境,为了避免不同环境之间相互干扰,通常需要独立部署数据库、缓存服务器等&…

Unity中的SystemInfo.deviceUniqueIdentifier 唯一ID

做游戏时可能经常使用SystemInfo.deviceUniqueIdentifier作为用户的唯一ID进行注册登录, 但是你会发现从谷歌商店上下载的自己游戏,和自己从Unity工程中直接打包出来的游戏账号竟然是不一致的! 这个坑还是很坑爹的,纠其原因是Sy…

sketchup生成面域插件_独家教程 | 快速抓取“高精准”场地信息,康石石教你生成不同“体量”地形...

无论建筑设计还是景观设计,同学们的设计项目都必须依托于场地来进行,通过分析场地的区位范围、地形地势,结合场地的局限性与可能性,才能进一步展开项目设计。可以说,获取场地信息是同学们在作品集创作中最重要的环节之…

Unity URP高度雾效果Shader

实现原理 见这篇文章Unity Shader-深度相关知识总结与效果实现(LinearDepth,Reverse Z,世界坐标重建,软粒子,高度雾,运动模糊,扫描线效果)_puppet_master的专栏-CSDN博客_shader深度…

无限重启_三星蓝光播放器出现无限自动重启BUG,涉及不少用户及不同型号

三星的蓝光播放器似乎遇到了一个挺严重的BUG,使得不少用户都开机后播放器会自动不停重启。从reddit、ZDNet以及三星技术支持论坛上面的情况来看,这次的问题波及不同型号的播放器,大部分用户遇到的问题都是不停重启。其中一位用户表示:“开机之…

python getattr_Python 内置方法和属性应用:反射和单例

1. 前言python除了丰富的第三方库外,本身也提供了一些内在的方法和底层的一些属性,大家比较常用的如dict、list、set、min、max、range、sorted等。笔者最近在做项目框架时涉及到一些不是很常用的方法和属性,在本文中和大家做下分享。2. 内置…

Unity URP世界空间后处理扫描圈效果Shader

实现原理 见这篇文章Unity Shader-深度相关知识总结与效果实现(LinearDepth,Reverse Z,世界坐标重建,软粒子,高度雾,运动模糊,扫描线效果)_puppet_master的专栏-CSDN博客_shader深度…

前端 重构时需要注意的事项_前端数据层落地实践

源宝导读:天际移动平台经过重构改版,近期正式发布了1.0版本,我们在低代码开发方面做了进一步增强。本文主要围绕前端Model、前端业务逻辑(领域模型)、数据层与视图层解耦(包装器模式)3个方面,给大家分享一下统一数据层方案的设计思…

postconstruct_@PostConstruct注解,你该好好看看

在最近的工作中,get到一个很实用的注解,分享给诸位。痛点做过微信或支付宝支付的童鞋,可能遇到过这种问题,就是填写支付结果回调,就是在支付成功之后,支付宝要根据我们给的地址给我们进行通知,通…

Unity URP运动模糊效果Shader

实现原理 见这篇文章Unity Shader-深度相关知识总结与效果实现(LinearDepth,Reverse Z,世界坐标重建,软粒子,高度雾,运动模糊,扫描线效果)_puppet_master的专栏-CSDN博客_shader深度…

线性系统的频率响应分析实验报告_动态系统的建模与分析

参考:DR_CAN1.介绍解决一个控制系统的问题:对研究对象进行分析控制器设计测试分析被控对象的物理特性及动态表现,在这个基础上建立数学模型,数学模型可以是动力学模型、热力学模型、流体力学模型和经济学模型等,然后在…

android 生命周期_Android生命周期组件 Lifecycle 源码详解(一)

在上篇文章:warmcheng:Android生命周期组件 Lifecycle 使用详解​zhuanlan.zhihu.com中,我们讲了 Lifecycle 的简单使用,本篇我们来研究下它的源码。 基础环境搭建首先,按照上篇文章所讲,快速搭建环境。添加…

Leetcode1143. 最长公共子序列(c#)

题解&#xff1a;力扣 public class Solution{public int LongestCommonSubsequence(string text1, string text2){int num1 text1.Length;int num2 text2.Length;int[,] dp new int[num1 1, num2 1];for(int i 0; i < num1; i){for(int j 0; j < num2; j){if(t…

telnet到设备里 php_PHP自动生成设备周检修计划

背景维修人员根据设备年度检修计划&#xff0c;然后制订周检修计划(设备年度计划包含设备一年需要维护几次等信息&#xff0c;根据年度计划分解到某一个周去执行)。在这个过程中&#xff0c;大量的excel复制粘贴工作&#xff0c;浪费人力并且容易出错。并且在审核过程中&#x…

通俗讲解:图像傅里叶变换

转自某乎&#xff1a;通俗讲解&#xff1a;图像傅里叶变换 - 知乎 这里我们主要要讲的是二维图像傅里叶变换&#xff0c;但是我们首先来看一张很厉害的一维傅里叶变换动图。 妈耶~厉害哇&#xff01;它把时域和频域解释的很清楚&#xff01; 什么&#xff01;你看不懂&#x…

数据库断线重连_干货分享—Niushop数据库配置

前几期阿牛ger主讲了代码编码规范&#xff0c;整洁规范的代码有利于我们查询和再次开发&#xff0c;也方便我们检测与修复bug&#xff01;这期&#xff0c;阿牛ger主要与大家分享数据库编码配置&#xff1a;数据库配置Niushop数据库配置方式与thinkphp相同&#xff0c;文件路径…

怎么将matlab滤波器系数导出_matlab与FPGA数字信号处理系列(1)——通过matlab工具箱设计FIR数字滤波器...

以99阶FIR低通滤波器为例&#xff0c;学习使用matlab的fdatool工具箱设计滤波器&#xff0c;并将滤波器系数导出到.coe文件&#xff0c;联合Vivado进行FPGA的FIR滤波器设计。本文滤波器参数为&#xff1a;低通FIR滤波器&#xff0c;窗函数设计&#xff0c;采用布莱克曼窗&#…

UGUI 合批原理

转自&#xff1a; UGUI合批原理笔记 - 赵青青 - 博客园 UGUI合批规则图解_时光不染-CSDN博客_ugui合批规则 合批的过程# 网格更新机制# Cavans.SendWillRenderCanvas m_LayoutRebuildQueuem_GraphicRebuildQueueCanvas.BuildBatch 更新所有DrawCall WaitingForJob 子线程网格…