本地定时下载远程服务器中的文件,下载完成后删除远程的文件
远程下载库paramiko
定时库apscheduler
话不多说,直接上代码
# 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
import sys, time
host = "0:0:0:0" # sftp ip地址,改成自己的服务端地址
port = 0000 # sftp端口,改成自己的服务端口
username = "test" # sftp用户名
password = "test" # sftp密码
local = '/local/' # 本地存储路径
remote = '/remote' # ftp目标文件所在路径
def progress_bar(transferred, toBeTransferred, suffix=''):
bar_len = 100
filled_len = int(round(bar_len * transferred / float(toBeTransferred)))
percents = round(100.0 * transferred / float(toBeTransferred), 1)
bar = '\033[32;1m%s\033[0m' % '=' * filled_len + '-' * (bar_len - filled_len)
sys.stdout.write('[%s] %s%s %s\r' % (bar, '\033[32;1m%s\033[0m' % percents, '%', suffix))
sys.stdout.flush()
# time.sleep(1)
def download(sftpconn):
print(local)
print(remote)
try: # 判断SFTP文件夹是否存在
sftpconn.chdir(remote)
print("exist")
except IOError:
print('SFTP内文件夹不存在!!!')
return
if not os.path.exists(local):
os.makedirs(local)
if os.path.isdir(local): # 判断本地参数是目录还是文件
for f in sftpconn.listdir(remote): # 遍历远程目录
print(f)
if os.path.exists(local+f):
local_size = os.path.getsize(os.path.join(local + f))
remote_size = sftpconn.stat(os.path.join(remote + f)).st_size
if local_size == remote_size:
#当下载完成之后,删除远程文件
print(local+f+'该文件已存在与服务器端文件大小相等!')
sftpconn.remove(remote + f)
print('远程文件'+remote + f + '删除完成!')
continue
sftpconn.get(os.path.join(remote + f), os.path.join(local + f), callback=progress_bar) # 下载目录中文件
print(remote + 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(sftp)
sftp.close()
# 主函数
# 程序开始全部扫描下载一遍
download_dl()
scheduler = BlockingScheduler()
# 每10分钟执行下载
cron_hourly = CronTrigger(month='*', day='*', hour='*', minute='10', second='0')
scheduler.add_job(download_dl, cron_hourly)
scheduler.start()