python實(shí)現(xiàn)定時(shí)壓縮指定文件夾發(fā)送郵件
工作中每天需要收集部門內(nèi)的FR文件,發(fā)送給外部部門的同事幫忙上傳,這么發(fā)了有大半年,昨天亮光一閃,為什么不做成自動(dòng)化呢,于是用python實(shí)現(xiàn)了整個(gè)流程,今天體驗(yàn)了一下真是美滋滋。
代碼如下
首先導(dǎo)入需要的包
import win32com.client as win32 import datetime import os import zipfile
定義三個(gè)函數(shù),都是網(wǎng)上抄別的同學(xué)作業(yè)來的(侵刪)
郵箱用的是outlook
#壓縮文件夾函數(shù)
def zip_ya(startdir,file_news):
file_news = startdir +'.rar' # 壓縮后文件夾的名字
z = zipfile.ZipFile(file_news,'w',zipfile.ZIP_DEFLATED) #參數(shù)一:文件夾名
for dirpath, dirnames, filenames in os.walk(startdir):
fpath = dirpath.replace(startdir,'') #這一句很重要,不replace的話,就從根目錄開始復(fù)制
fpath = fpath and fpath + os.sep or ''#這句話理解我也點(diǎn)郁悶,實(shí)現(xiàn)當(dāng)前文件夾以及包含的所有文件的壓縮
for filename in filenames:
z.write(os.path.join(dirpath, filename),fpath+filename)
print ('壓縮成功')
z.close()
#創(chuàng)建文件夾函數(shù) def mkdir(path): folder = os.path.exists(path) if not folder: os.makedirs(path) print "創(chuàng)建文件夾成功" else: print "文件夾已存在"
#發(fā)送郵件函數(shù)
def sendmail(path):
sub = '上傳FR文件申請'
body = '@xx,\r請幫忙上傳FR文件,謝謝!'
outlook = win32.Dispatch('outlook.application')
receiver = ['xxx@xx.com']
ccreceiver = ['xxx@xx.com;xxx@xx.com;xxx@xx.com;xxx@xx.com']
mail = outlook.CreateItem(0)
mail.To = receiver[0]
mail.Cc = ccreceiver[0]
mail.Subject = sub.decode('utf-8')
mail.Body = body.decode('utf-8')
mail.Attachments.Add(path)
mail.Send()
文件夾名稱為日期,每天腳本運(yùn)行時(shí),會(huì)新建一個(gè)明天的文件夾,并把昨天的壓縮文件刪除,所以先定義幾個(gè)日期參數(shù)。
這里碰到一個(gè)坑,文件路徑含中文時(shí),用這個(gè)函數(shù)os.path.exists()測試都是False,即沒有被識(shí)別到,用unicode(todaypath,'utf-8')轉(zhuǎn)為unicode后問題解決。
#獲取今天明天昨天的日期
today = datetime.date.today().strftime("%Y%m%d")
tomorrow = (datetime.date.today()+ datetime.timedelta(days=1)).strftime("%Y%m%d")
yesterday = (datetime.date.today()+ datetime.timedelta(days=-1)).strftime("%Y%m%d")
#定義文件路徑
path='//tcent.cn/dfs/26.xx事業(yè)部/10.xx市場營銷中心/04.xxx部/02.xxx組/FR文件上傳/'
todaypath=path + today
todayfile = path + today + '.rar'
tomorrowpath=path + tomorrow
utodaypath=unicode(todaypath,'utf-8')
utodayfile=unicode(todayfile,'utf-8')
utomorrowpath=unicode(tomorrowpath,'utf-8')
#定義昨天的壓縮文件
yesterdayfile=path + yesterday + '.rar'
uyesterdayfile=unicode(yesterdayfile,'utf-8')
#計(jì)算今天文件夾下的文件個(gè)數(shù)
filenum = 0
for filename in os.listdir(utodaypath):
filenum += 1
#創(chuàng)建明天的文件夾
mkdir(utomorrowpath)
#刪除昨天的壓縮文件
if os.path.exists(uyesterdayfile): # 如果文件存在
os.remove(uyesterdayfile)
else:
print('no such file:%s'%uyesterdayfile)
在思考如何讓腳本每天自動(dòng)運(yùn)行時(shí),決定采用windows定時(shí)任務(wù)配置(因?yàn)闆]看懂python定時(shí)器..)但是windows只能設(shè)置為每天運(yùn)行,實(shí)際上周末、節(jié)假日是不需要發(fā)送郵件的,而節(jié)假日補(bǔ)班時(shí)需要運(yùn)行任務(wù),可以在代碼端進(jìn)行控制。
if條件那段就是先判斷是否是空文件夾,如果沒有文件就不用發(fā)了,如果有文件,再判斷今天的日期,決定要不要發(fā)郵件。
#獲取今天是周幾 weekoftoday=datetime.date.today().weekday() #節(jié)假日列表 holiday=['20180924','20181001','20181002','20181003','20181004','20181005'] #補(bǔ)班列表 workday=['20180924','20180925'] #是否是周末 isweekend=(weekoftoday == 5 or weekoftoday == 6) #是否是小長假 isholiday=today in holiday #是否不要補(bǔ)班 isworkday=today not in workday #文件夾是否為空 isnullfile=(filenum==0) #判斷是否要壓縮文件并發(fā)送郵件 #周末、工作日放假的節(jié)假日、文件夾為空時(shí)不執(zhí)行 #補(bǔ)班的周末例外 if isnullfile: pass else: if ((isweekend or isholiday) and isworkday ): pass else: #壓縮今天的文件夾 zip_ya(utodaypath,today) #發(fā)送郵件 sendmail(utodayfile)
最后把這個(gè)python存成bat文件,去windows定時(shí)任務(wù)里配置即可。
@echo off cd D:\myprograms\sendmail start python sendmail.py
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- python后端接收前端回傳的文件方法
- python實(shí)現(xiàn)文件+參數(shù)發(fā)送request的實(shí)例代碼
- Python實(shí)現(xiàn)監(jiān)控Nginx配置文件的不同并發(fā)送郵件報(bào)警功能示例
- python 通過 socket 發(fā)送文件的實(shí)例代碼
- python實(shí)現(xiàn)requests發(fā)送/上傳多個(gè)文件的示例
- python調(diào)用Moxa PCOMM Lite通過串口Ymodem協(xié)議實(shí)現(xiàn)發(fā)送文件
- python實(shí)現(xiàn)TCP文件接收發(fā)送
相關(guān)文章
Python生成器深度解析如何構(gòu)建強(qiáng)大的數(shù)據(jù)處理管道
這篇文章主要為大家介紹了Python生成器深度解析如何構(gòu)建強(qiáng)大的數(shù)據(jù)處理管道,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06
python 實(shí)現(xiàn)對文件夾中的圖像連續(xù)重命名方法
今天小編就為大家分享一篇python 實(shí)現(xiàn)對文件夾中的圖像連續(xù)重命名方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-10-10
Python練習(xí)之操作MySQL數(shù)據(jù)庫
這篇文章主要介紹了Python練習(xí)之操作MySQL數(shù)據(jù)庫,文章通過如何創(chuàng)建MySQL數(shù)據(jù)表?如何向MySQL表中插入數(shù)據(jù)?如何查詢MySQL中的數(shù)據(jù)?的三個(gè)問題展開了詳細(xì)的內(nèi)容介紹2022-06-06
Python使用Pandas庫實(shí)現(xiàn)MySQL數(shù)據(jù)庫的讀寫
這篇文章主要介紹了Python使用Pandas庫實(shí)現(xiàn)MySQL數(shù)據(jù)庫的讀寫 ,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
OpenCV實(shí)現(xiàn)車輛識(shí)別和運(yùn)動(dòng)目標(biāo)檢測
本文主要介紹了OpenCV實(shí)現(xiàn)車輛識(shí)別和運(yùn)動(dòng)目標(biāo)檢測,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08
python進(jìn)行debug操作實(shí)戰(zhàn)訓(xùn)練
debug是編碼是非常重要的調(diào)試技巧,通過在運(yùn)行過程中設(shè)置斷點(diǎn),幫助開發(fā)人員更好的理解運(yùn)行過程,下面這篇文章主要給大家介紹了關(guān)于python進(jìn)行debug操作的相關(guān)資料,需要的朋友可以參考下2023-06-06
用ReactJS和Python的Flask框架編寫留言板的代碼示例
這篇文章主要介紹了用ReactJS和Python的Flask框架編寫留言板的代碼示例,其他的話用到了MongoDB這個(gè)方便使用JavaScript來操作的數(shù)據(jù)庫,需要的朋友可以參考下2015-12-12
Python中的函數(shù)式編程:不可變的數(shù)據(jù)結(jié)構(gòu)
今天小編就為大家分享一篇關(guān)于Python中的函數(shù)式編程:不可變的數(shù)據(jù)結(jié)構(gòu),小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2018-10-10

