1、需求:
连接sftp 下载对应文件夹下的文件夹。
逐小时下载01和ob文件夹下当日的文件
每天5点和17点下载03文件夹下的文件
文件夹更新下载按照中国区时间,sftp上传文件名和时间按照世界时
2、代码
# coding=utf-8
import datetime
import paramiko # paramiko模块,基于SSH用于连接远程服务器并执行相关操作
import os
import time
from apscheduler.schedulers.blocking import BlockingScheduler # 定时任务模块
from apscheduler.triggers.cron import CronTrigger
host = "xx.xx.xx.xx" # sftp ip地址
port = xx # sftp端口
username = "xxxx" # sftp用户名
password = "xx" # sftp密码
local = 'E:/thunder/' # 本地存储路径
remote = '03/20200303/' # ftp目标文件所在路径
dirs = ['01', '03', 'ob']
def download(localpath, remotepath, sftpconn):
print(localpath)
print(remotepath)
try: # 判断SFTP文件夹是否存在
sftpconn.chdir(remotepath)
print("exist")
except IOError:
print('SFTP内文件夹不存在!!!')
return
if not os.path.exists(localpath):
os.makedirs(localpath)
if os.path.isdir(localpath): # 判断本地参数是目录还是文件
# localpath = localpath + '20200303/'
for f in sftpconn.listdir(remotepath): # 遍历远程目录
if os.path.exists(localpath+f):
print(localpath+f+'该文件已存在!')
continue
sftpconn.get(os.path.join(remotepath + f), os.path.join(localpath + f)) # 下载目录中文件
print(remotepath + f + '下载完成!')
else:
sftpconn.get(remotepath, localpath) # 下载文件
return
def download_dl():
print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())+'开始执行短临数据下载定时任务:')
utc = time.strftime('%Y%m%d', time.gmtime())
print('当前世界时日期为' + utc)
sf = paramiko.Transport((host, port))
sf.connect(username=username, password=password)
sftp = paramiko.SFTPClient.from_transport(sf)
dl_local = local + '01' + '/' + utc + '/'
dl_remote = '/' + '01' + '/' + utc + '/'
download(dl_local, dl_remote, sftp)
sftp.close()
def download_yc():
print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())+'开始执行预测数据下载定时任务:')
# 获取今天(现在时间)
today = datetime.datetime.today()
# 昨天
yesterday = today - datetime.timedelta(days=1)
yesterday = yesterday.__format__('%Y%m%d')
print('当前世界时日期为' + yesterday)
sf = paramiko.Transport((host, port))
sf.connect(username=username, password=password)
sftp = paramiko.SFTPClient.from_transport(sf)
yc_local = local + '03' + '/' + yesterday + '/'
yc_remote = '/' + '03' + '/' + yesterday + '/'
download(yc_local, yc_remote, sftp)
sftp.close()
def download_sk():
print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())+'开始执行实况数据下载定时任务:')
utc = time.strftime('%Y%m%d', time.gmtime())
print('当前世界时日期为' + utc)
sf = paramiko.Transport((host, port))
sf.connect(username=username, password=password)
sftp = paramiko.SFTPClient.from_transport(sf)
sk_local = local + 'ob' + '/' + utc + '/'
sk_remote = '/' + 'ob' + '/' + utc + '/'
download(sk_local, sk_remote, sftp)
sftp.close()
# 主函数
# 程序开始全部扫描下载一遍
download_dl()
download_yc()
download_sk()
scheduler = BlockingScheduler()
# 每小时执行下载
cron_hourly = CronTrigger(month='*', day='*', hour='*', minute='10', second='0')
scheduler.add_job(download_dl, cron_hourly)
# 每天21时00分执行下载
cron_pm = CronTrigger(month='*', day='*', hour='21', minute='00', second='0')
scheduler.add_job(download_yc, cron_pm)
# 每天05时00分执行下载
cron_am = CronTrigger(month='*', day='*', hour='06', minute='00', second='0')
scheduler.add_job(download_yc, cron_am)
# 每小时执行下载
scheduler.add_job(download_sk, cron_hourly)
scheduler.start()