Python 从sftp下载文件并使用定时任务实现指定时间下载

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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值