python读exchange邮箱excel附件 写入mysql

Reason

最近在做渠道数据的梳理,发现有不少数据是通过发送邮件的方式提供数据,之前手动编辑过几次插入业务mysql数据库,觉得作为一个程序媛老这么干太low了,所以写了个python小脚本,让它自己定时跑去了

Steps

  • 验证邮箱拿到excel的xlsx格式附件存到本地文件夹
  • 拿已有mysql数据,看看已经写入过哪些日期
  • 读取excel数据,把没有插入过日期到数据写入到mysql里

OS & Libs

工作环境mac

  • 安装exchangelib
    作用:读exchange邮件需要
    安装和使用见官网 https://pypi.org/project/exchangelib/

  • 安装xlrd
    作用:读excel需要
    1、官网下载压缩包 https://pypi.org/project/xlrd/
    2、解压压缩包
    3、进入到解压的文件夹
    4、执行指令:sudo python setup.py install

  • 安装MySQLdb
    作用:读mysql需要
    1、官网下载压缩包 https://pypi.org/project/MySQL-python/1.2.5/
    2、解压压缩包
    3、进入到解压的文件夹
    4、执行指令:sudo python setup.py install

  • 安装msyql
    默认你本地已经有mysql

Codes


#!/usr/bin/python
# -*- coding: UTF-8 -*-
from exchangelib import DELEGATE, IMPERSONATION, Account, Credentials, ServiceAccount, \
    EWSDateTime, EWSTimeZone, Configuration, NTLM, GSSAPI, CalendarItem, Message, \
    Mailbox, Attendee, Q, ExtendedProperty, FileAttachment, ItemAttachment, \
    HTMLBody, Build, Version, FolderCollection,EWSDate
from exchangelib.protocol import NoVerifyHTTPAdapter
from datetime import datetime, timedelta
import os
import datetime
import xlrd
import MySQLdb

def DownloadExcel(filter_day):
    creds = Credentials(
        username='emailname',
        password='XXXXXXXXX'
    )
    account = Account(
        primary_smtp_address='emailname@xxxx.com',
        credentials=creds,
        autodiscover=True,
        access_type=DELEGATE
    )
    local_path=os.path.join(base_path, str(filter_day.date())+'.xlsx')
    print 'DownloadExcel',local_path
    qs=account.inbox
    #q=Q(start__gte=filter_day)&Q(subject__icontains='DSP-wifi-')
    q=Q(subject__icontains='DSP-wifi-'+str(filter_day.date()))
    items=qs.filter(q)
    for item in items:
        for attachment in item.attachments:
            if isinstance(attachment, FileAttachment):
                with open(local_path, 'wb') as f:
                    f.write(attachment.content)
                print('Saved attachment to', local_path)
#插入数据
def insertData(sql):
    db = MySQLdb.connect("localhost", "root", "yourpassword", "yourdb", charset='utf8' )

    cursor = db.cursor()
    try:
       cursor.execute(sql)
       db.commit()
    except:
       db.rollback()
    db.close()
#拿到已有数据
def getExistDataDate():
    result=[]
    db = MySQLdb.connect("localhost", "root", "yourpassword", "yourdb", charset='utf8' )
    cursor = db.cursor()

    sql = "SELECT dt FROM cooperation_data "
    try:

        cursor.execute(sql)
        results = cursor.fetchall()
        for row in results:
            result.append(row[0])
            existsDate = row[0]
            print "existsDate=%s" % (existsDate)
    except:
       print "Error: unable to fecth data"
    db.close()
    return result

#excel读数据
def ReadDataFromExcel(filter_day):
    local_path=os.path.join(base_path, str(filter_day.date())+'.xlsx')
    print 'ReadDataFromExcel',local_path
    dataNew=[]
    if os.path.exists(local_path):
        workbook = xlrd.open_workbook(r'%s'%(local_path))
        sheet_name= workbook.sheet_names()[0]
        sheet=workbook.sheet_by_name(sheet_name)
        #遍历excel单元格,不要标题行,序号从1开始
        for i in range(1,sheet.nrows):
            dataNewRow=[]
            #业务需要拿到特定列
            for j in [0,2,3,5,6]:
                if (sheet.cell(i,j).ctype == 3):
                    date_value = xlrd.xldate_as_tuple(sheet.cell_value(i,j),workbook.datemode)
                    date_tmp = datetime.date(*date_value[:3]).strftime('%Y-%m-%d')
                    dataNewRow.append(date_tmp)
                else:
                    dataNewRow.append(sheet.cell_value(i,j))
            dataNew.append(dataNewRow)
    return dataNew

if __name__=="__main__":
    
    tz = EWSTimeZone.localzone()
    year=datetime.datetime.now().year
    month=datetime.datetime.now().month
    day=datetime.datetime.now().day
    filter_day = tz.localize(EWSDateTime(year,month,day,0,0))
    print filter_day

    base_path='/Users/lily/workspace/email_data'

    DownloadExcel(filter_day)
    existDates=getExistDataDate()
    dataNew=ReadDataFromExcel(filter_day)

    for row in dataNew:
        if row[0] not in existDates:
            sql="insert into cooperation_data (dt,impression,clicks,cost,ecpm) value('%s',%d,%d,%.2f,%.2f);"%(str(row[0]),int(row[1]),int(row[2]),float(row[3]),float(row[4]))
            print sql
            insertData(sql)

At Last

还是python小白,大神看到莫笑

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容

  • # Python 资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列...
    小迈克阅读 2,862评论 1 3
  • # Python 资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列...
    aimaile阅读 26,294评论 6 428
  • Python资源大全中文版,包括:Web框架、网络爬虫、模板引擎、数据库、数据可视化、图片处理等,由伯乐在线持续更...
    dxl1236阅读 4,527评论 2 33
  • 英文原版:https://github.com/vinta/awesome-python中文版:https://g...
    会灰的大飞狼阅读 3,559评论 1 56
  • 朝阳惜雨露 不忍热烈 用微风轻抚 掠过刚清醒的世界 像极了你 刚睁开的双眼 蓦然地温暖了心坎
    陌淮里阅读 213评论 0 4