使用python连接clickhouse并发送邮件

1. 概览

需求:给对应的广告商发送前一天的投放的广告数据

选择:说实话是因为自己java太差,感觉python做这个会简单一点,所以选了它

遇到的问题

​ 1.要在不影响线上python环境的前提下,安装自己所需要的各种模块

​ 2.使用virtualenv虚拟python环境遇到的timeout的问题

​ 3.模块的选择

​ 4.发送给各个广告商的邮件的正式化(就是发送的模板好看一点)

2. 解决问题

  1. 最初真的不知道何为自己虚拟一个python环境来搞,还是同事大神告诉的用virtualenv来虚拟出来一个自己的python环境

    1) 使用pip 安装 virtualenv

    pip install  virtualenv
    

    2) 创建指定的目录

    mkdir myproject
    cd myproject
    

    3) 创建一个独立的运行环境

    virtualenv myenv
    

    4) 新建的python的环境就在当前目录下的myenv目录,用source进入该环境

    source ./myenv/bin/activate
    

    5) 退出虚拟环境

    deactivate
    

  1. 刚开始遇到这个问题,真的无从下手,还是求助同事,pip换源

    临时使用:切换成阿里云的镜像

    pip install -i http://mirrors.aliyun.com/pypi/simple/tensorflow
    

    永久使用:linux下,修改~/.pip/pip.conf(没有就创建一个)

    [global]
    timeout = 60000
    index-url = https://pypi.tuna.tsinghua.edu.cn/simple
    
  2. 使用到的所有的python模块

    (发送邮件选取的模块还可以选择smtplib,不选这个的原因是我的虚拟环境找不到对应的包)

    datetime 获取时间
    os 调用系统命令
    sys 系统输入输出
    pandas 处理数据成xlsx,并添加表头
    xlrd(刚开始我以为读取的是xlsx文件) 读取xlsx文件
    clickhouse_driver 连接clickhouse
    exchangelib 发送邮件的模块
    exchangelib.protocol 绕过ssl证书验证
  3. 代码奉上

    #!/usr/bin/env python
    # coding:utf-8import datetime
    import os
    import sysimport pandas as pd
    import xlrd
    from clickhouse_driver import Client
    from exchangelib import Account, FileAttachment, Message, Mailbox, Configuration, Credentials, DELEGATE, HTMLBody
    from exchangelib.protocol import BaseProtocol, NoVerifyHTTPAdapterBaseProtocol.HTTP_ADAPTER_CLS = NoVerifyHTTPAdapterclass ProxyAdData:def __init__(self):reload(sys)sys.setdefaultencoding('utf-8')# 初始化clickhouse连接self.client = Client(host='127.0.0.1', port=9008, password='password')# 刚开始以为是读取xlsx文件获取对应信息,然后被喷,改为读取txtself.workbook = xlrd.open_workbook('./媒体邮件信息.xlsx', encoding_override='UTF-8').sheet_by_index(0)# 获取前一天的日期self.date = str(datetime.date.today() + datetime.timedelta(-1))self.game = {'game':'游戏'}# 对应的广告商self.channel = {'channel':'渠道'}# 输出xlsx文件的表头self.columns = ['column1','column2']self.column_names = ['列名1','列名2']# 为了保存历史数据os.popen('mkdir -p ./data/%(dt)s' % {'dt': self.date})def run(self):for line in open('./proxy.txt', 'r'):game, proxy, email, frequency, channel, ctype, aid, cid_name = line.strip('\n').split('\t')# 拼接sqlsql = self.connect_sql(game, str(channel), str(ctype).split('.')[0], str(aid).split('.')[0],str(cid_name).split('.')[0])print(sql)# 执行sqldata = self.exec_sql(sql)if len(data) == 0:continueprint(data)# excel_nameexcel_name = '%(proxy)s_%(channel)s_%(ctype)s.xlsx' % {'proxy': proxy, 'channel': channel, 'ctype': ctype}# 生成excelself.create_xlsx(data, excel_name)# 发送邮件for pre_email in email.split(','):self.send_email(excel_name, game, channel, pre_email)def connect_sql(self, game, channel, ctype, aid, cid_name):channel_name = channelsql = 'select \'%(channel_name)s\',%(column)s from data01.ad_base where game = %(game)s and clicktime = %(date)s and channel = %(channel)s and ctype = %(ctype)s ' % {'channel_name': channel_name, 'column': ','.join(self.columns), 'game': "'" + game + "'",'date': "'" + self.date + "'", 'channel': "'" + self.channel[channel] + "'", 'ctype': "'" + ctype + "'"}if aid != '' or len(aid) != 0:sql += ' and aid = %(aid)s' % {'aid': "'" + aid + "'"}if cid_name != '' or len(cid_name) != 0:sql += ' and cid_name = %(cid_name)s ' % {'cid_name': "'" + cid_name + "'"}return sqldef exec_sql(self, sql):return self.client.execute(sql)def create_xlsx(self, data, excel_name):dataf = pd.DataFrame(data)dataf.columns = self.column_namesprint(dataf)# 生成excelwriter = pd.ExcelWriter('./data/' + self.date + '/' + excel_name)dataf.to_excel(writer, sheet_name='ad_data')writer.save()writer.close()def send_email(self, file, game, channel, to_email):credentials = Credentials('邮箱用户名', '邮箱密码')config = Configuration(credentials=credentials, server='邮箱服务器')a = Account(primary_smtp_address='邮箱用户名', access_type=DELEGATE, autodiscover=False, config=config)m = Message(account=a,subject='【%(game)s】【%(channel)s】%(dt)s 广告数据' % {'game': self.game[game], 'channel': channel,'dt': self.date},# 为了对外好看一点,所以回复的邮件正文是html的body=HTMLBody(),to_recipients=[Mailbox(email_address=to_email),],# 抄送cc_recipients=[''])with open(os.path.abspath(r"./data/" + self.date + "/" + file), "rb") as f:cont = f.read()attchF = FileAttachment(name=file, content=cont)m.attach(attchF)m.send_and_save()if __name__ == '__main__':pad = ProxyAdData()pad.run()

    由衷感谢陪我成长的西米先生,手动笔芯

使用python连接clickhouse并发送邮件相关推荐

  1. python连接clickhouse

    搞大数据之前, 还是先用python验证下,可以避免很多不必要的麻烦. 安装依赖: pip install clickhouse-driver 代码验证: from clickhouse_driver ...

  2. python链接mysql 判断是否成功_【初学python】使用python连接mysql数据查询结果并显示...

    因为测试工作经常需要与后台数据库进行数据比较和统计,所以采用python编写连接数据库脚本方便测试,提高工作效率,脚本如下(python连接mysql需要引入第三方库MySQLdb,百度下载安装) # ...

  3. python连接oracle数据库_Python连接oracle数据库 例子一

    step1:下载cx_Oracle模块,cmd--pip install cx_Oracle step2: 1 import cx_Oracle #引用模块cx_Oracle 2 conn=cx_Or ...

  4. 简单介绍python连接telnet和ssh的两种方式

    本文主要介绍了python连接telnet和ssh的两种方式,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 Telnet 连接方式 #!/usr/bin/env p ...

  5. python连接MySQL并进行数据查询

    python连接MySQL并进行数据查询 #建立数据库的连接 mydb = mysql.connector.connect(host="0.0.0.0",user="ro ...

  6. python连接access数据库查询并打印出来_Python连接Access和读取Access数据库的例子

    其实这个Python连接Access和读取Access数据库的例子是写给自己看的,网上已经有Python读取Access的例子了,我这个也是参考以上制作的. 而这个例子应该是只能在windows使用吧 ...

  7. python连接sqlite数据库的代码_【Python 连接SQLite数据库文件】

    涉及: Python连接db文件 如何按照列名获取数据 如何传入参数 示例代码如下: # encoding=utf-8 import sqlite3 def get_signal_names(db_f ...

  8. python连接elasticsearch查询数据

    python连接elasticsearch获取数据 原文:https://blog.csdn.net/ziqiaowang/article/details/54972279 # -*- encodin ...

  9. mac版python连接mysql_Mac下Python连接MySQL · BlBana’s BlackHouse

    Mac和Windows下安装mysqlclient坑点记录 Python连接MySQL(mysqlclient) Python连接MySQL类库pymysql python3:mysqlclient, ...

最新文章

  1. SharePoint工作流解决方案QuickFlow系列(2)--Task
  2. 讲讲类的实例化顺序,比如父类静态数据,构造函数,字段,子类静态数据,构造函数,字段,当 new 的时候, 他们的执行顺序
  3. Hamcrest Matchers教程
  4. 为什么移动卡上到手机上显示无服务器,移动手机卡加密失败然后就没有服务器无聊的时候给手机卡加密因为不知? 爱问知识人...
  5. 清华大学2019计算机录取分数线,2019年清华大学各省各批次录取分数线
  6. 手写及场景文字分析与识别的一些新尝试
  7. java随机打印一个数组元素_java 怎么随机打印自定义数组里面的字符串
  8. 工作难找,朋友却一口气拿了5份大厂offer,他是怎么做到的?
  9. 190320每日一句
  10. win10开机登录不需要密码默认账号
  11. 渐近记号(Asymptotic Notations)
  12. AP6212认证_自适应测试
  13. python对电商运营有帮助吗_做电商运营需要学习python嘛?
  14. 多层板PCB设计知识
  15. macos 系统固件 路径_iTunes下载的固件在哪里?iTunes固件文件路径详解
  16. 04.jQuery++1201
  17. 210413赛后总结
  18. flex 的图片浏览
  19. 【解答】多台西门子PLC之间可不可以无线通讯
  20. 3756. 筛选链表

热门文章

  1. 如何学习stm32,怎么学习stm32,不是仅仅看教程,照着写复制代码
  2. js之清除Cookie
  3. 智能可穿戴的时尚单品,到底是不是“智商税”?
  4. Oracle to_char()函数的用法
  5. Pytorch应用训练好的模型
  6. Cesium中对geojson的处理
  7. Flutter 圆形(头像)图片的 4种实现
  8. echarts的series配置
  9. php集成环境和自己配置的区别,php集成环境、php绿色集成环境、php独立安装版环境这三者的区别
  10. hihocoder01串