python 本地定时下载远程文件

  • Post author:
  • Post category:python




本地定时下载远程服务器中的文件,下载完成后删除远程的文件

远程下载库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()



版权声明:本文为qq_33692331原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。