1. 程式人生 > >Python | 定時壓縮指定資料夾傳送郵件

Python | 定時壓縮指定資料夾傳送郵件

工作中每天需要收集部門內的FR檔案,傳送給外部部門的同事幫忙上傳,這麼發了有大半年,昨天亮光一閃,為什麼不做成自動化呢,於是用python實現了整個流程,今天體驗了一下真是美滋滋。

程式碼如下

首先匯入需要的包

import win32com.client as win32
import datetime
import os
import zipfile

定義三個函式,都是網上抄別的同學作業來的(侵刪)
郵箱用的是outlook

#壓縮資料夾函式
def zip_ya(startdir,file_news):
    file_news = startdir +'.rar'
# 壓縮後文件夾的名字 z = zipfile.ZipFile(file_news,'w',zipfile.ZIP_DEFLATED) #引數一:資料夾名 for dirpath, dirnames, filenames in os.walk(startdir): fpath = dirpath.replace(startdir,'') #這一句很重要,不replace的話,就從根目錄開始複製 fpath = fpath and fpath + os.sep or ''#這句話理解我也點鬱悶,實現當前資料夾以及包含的所有檔案的壓縮 for
filename in filenames: z.write(os.path.join(dirpath, filename),fpath+filename) print ('壓縮成功') z.close()
#建立資料夾函式
def mkdir(path):
    folder = os.path.exists(path)
    if not folder:                   
        os.makedirs(path)         
        print "建立資料夾成功"
    else
: print "資料夾已存在"
#傳送郵件函式
def sendmail(path):
    sub = '上傳FR檔案申請'
    body = '@xx,\r請幫忙上傳FR檔案,謝謝!'
    outlook = win32.Dispatch('outlook.application')
    receiver = ['[email protected]']
    ccreceiver = ['[email protected];[email protected];[email protected];[email protected]']
    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() 

資料夾名稱為日期,每天指令碼執行時,會新建一個明天的資料夾,並把昨天的壓縮檔案刪除,所以先定義幾個日期引數。
這裡碰到一個坑,檔案路徑含中文時,用這個函式os.path.exists()測試都是False,即沒有被識別到,用unicode(todaypath,’utf-8’)轉為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事業部/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')

#計算今天資料夾下的檔案個數
filenum = 0   
for filename in os.listdir(utodaypath):
    filenum += 1

#建立明天的資料夾
mkdir(utomorrowpath) 

#刪除昨天的壓縮檔案
if os.path.exists(uyesterdayfile): # 如果檔案存在
    os.remove(uyesterdayfile) 
else:
    print('no such file:%s'%uyesterdayfile)

在思考如何讓指令碼每天自動執行時,決定採用windows定時任務配置(因為沒看懂python定時器..)但是windows只能設定為每天執行,實際上週末、節假日是不需要傳送郵件的,而節假日補班時需要執行任務,可以在程式碼端進行控制。
if條件那段就是先判斷是否是空資料夾,如果沒有檔案就不用發了,如果有檔案,再判斷今天的日期,決定要不要發郵件。

#獲取今天是周幾
weekoftoday=datetime.date.today().weekday()
#節假日列表
holiday=['20180924','20181001','20181002','20181003','20181004','20181005']
#補班列表
workday=['20180924','20180925']

#是否是週末
isweekend=(weekoftoday == 5 or  weekoftoday == 6)
#是否是小長假
isholiday=today in holiday
#是否不要補班
isworkday=today not in workday
#資料夾是否為空
isnullfile=(filenum==0)

#判斷是否要壓縮檔案併發送郵件
#週末、工作日放假的節假日、資料夾為空時不執行
#補班的週末例外
if isnullfile:
    pass
else:
    if ((isweekend or isholiday) and isworkday ):
        pass
    else:
         #壓縮今天的資料夾
         zip_ya(utodaypath,today)
         #傳送郵件
         sendmail(utodayfile)

最後把這個python存成bat檔案,去windows定時任務裡配置即可。

@echo off 

cd D:\myprograms\sendmail

start python sendmail.py

相關推薦

Python | 定時壓縮指定資料傳送郵件

工作中每天需要收集部門內的FR檔案,傳送給外部部門的同事幫忙上傳,這麼發了有大半年,昨天亮光一閃,為什麼不做成自動化呢,於是用python實現了整個流程,今天體驗了一下真是美滋滋。 程式碼如下 首先匯入需要的包 import win32com.

Python如何讀取指定資料下的所有影象

(1)資料準備 資料集介紹: 資料集中存放的是1223幅影象,其中756個負樣本(影象名稱為0.1~0.756),458個正樣本(影象名稱為1.1~1.458),其中:"."前的標號為樣本標籤,"."後的標號為樣本序號 (2)利用python讀取資料夾中所有影象 1 ''

python 獲取指定資料下所以檔案

reportPath =資料夾路徑 listdir=以一個list返回資料夾下所以檔案 dirs = os.listdir(reportPath)print(dirs) def __get_report(self): """獲取最新測試報告""" dirs = os.listdir(repo

Spring定時任務註解實現定時清空指定資料下的檔案

@EnableScheduling和@Scheduled(cron = "0 0 4 * * ?"),通過註解方式實現定時任務: 1 import org.slf4j.Logger; 2 import org.slf4j.LoggerFactory; 3 import org.springfra

Python批量刪除全資料下的部分指定檔名的檔案

“”" Python批量刪除指定資料夾下的指定檔名的檔案 “”" import os ##首先匯入os模組,進行檔案的查詢,修改,刪除等操作一般都要事先匯入os模組 def file_name(file_dir): list = [] for root, dir

python的os庫來剪下指定資料

思路:         1:遍歷指定的資料夾。         2:判斷資料夾中的每一項是資料夾還是檔案。         3:若是檔案就修改該檔案

python 獲取指定資料的大小

  def getdirsize(dirpath): size = 0 for root, dirs, files in os.walk(dirpath): size += sum([getsize(join(root, name)) for name in

java把指定資料下的所有檔案壓縮成zip包

<span style="font-size:18px;background-color:rgb(204,204,204);">package cn.gov.csrc.base.util; import java.io.BufferedInputStream

python 爬取指定圖片並將圖片下載到指定資料

""" Version 1.1.0 Author lkk Email [email protected] date 2018-10-19 11:34 DESC 下載指定網頁的圖片到指定資料夾

Python例項1-讀取指定資料指定型別的圖片名,打亂後輸出txt

import random import os def file_name(file_dir): L=[] for root, dirs, files in os.

kettle從mysql中查詢出特定的資料然後傳送郵件附件到指定的郵箱。

剛開始接觸kettle,還是小白,但是感覺這東西挺強大。 做了一個傳送附件excel到指定郵箱的demo。現在記錄如下。 1. 2. 3. . 4.job檔案 新建job檔案,在空白處設定屬性 5.拖入以下按鈕 設定郵件引數 到這裡應該就差不多了,執行成功的截

python查詢指定資料下所有檔案並按修改時間倒序排列

程式碼如下: import os, glob, time def search_all_files_return_by_time_reversed(path, reverse=True):

python列出指定資料下所有給定字尾名的檔案

寫了一個小程式來實現這個功能。 程式的輸入是指定的資料夾路徑和指定的字尾名(預設為列出所有檔案) 程式碼如下: #coding:utf8 import os def listfile(dirname,postfix = ''): filelist = []

python 獲取指定資料下的檔名

本文采用os.walk()和os.listdir()兩種方法,獲取指定資料夾下的檔名。 os.walk() 模組os中的walk()函式可以遍歷資料夾下所有的檔案。 os.walk(top, topdown=Ture, onerror=None, fo

java 將指定資料遞迴的進行zip打包壓縮

1.注意事項 功能:指定資料夾目錄,則會將該資料夾名稱為新的壓縮檔名稱,新的壓縮檔案會在指定檔案同級目錄下,然後將該資料夾下的子檔案和子資料夾都進行壓縮打包。 2.示例程式碼: package tmp.MavenTest; import java.io.BufferedI

C++ 獲取指定資料指定字尾名檔案

#include <dirent.h> #include <iostream> #include <regex> #include <string> std::vector<std::string> faceDescriptor

【Android】複製assets裡的單檔案到指定資料

轉載請註明出處,原文連結:https://blog.csdn.net/u013642500/article/details/80069811 本方法使用前提是已擁有許可權,未對許可權不足情況進行處理,如有需要可自行新增。 關於讀寫許可權的總結請參考:https://blog.csdn.n

java 刪除指定資料 以及檔案下下面的所有檔案

java 刪除指定資料夾 以及檔案下下面的所有檔案 2017年08月28日 00:24:20 閱讀數:3700 檔案路徑的分隔符在windows系統和linux系統中是不一樣。 比如說要在temp目錄下建立一個test.txt檔案,在Windows下應該這麼寫: File file1 =

Python3.6 讀取txt內容建立資料;將圖片拷貝至指定資料,並刪除圖片

 讀取txt內容建立資料夾 # 引入模組 import os #建立資料夾 def mkdir(path): # 去除首位空格 path = path.strip() # 去除尾部 \ 符號 path = path.rstrip("\\")

python 判斷檔案還是資料

import os if os.path.isdir(path): print "it's a directory" elif os.path.isfile(path): print "it's a normal file" else: print "it's a s