从服务器中每隔5分钟下载数据到本地

本文介绍了如何使用Python的paramiko库实现SSH连接,通过getRemoteFiles函数递归地从FTP服务器下载文件,并利用scheduler进行定时任务调度,以便定期执行文件下载操作。
摘要由CSDN通过智能技术生成
import stat
import datetime
import paramiko
import os
import time
import sched
from common.log_utils import get_logger

logging = get_logger(__name__)

# ip和端口号(port)
transport = paramiko.Transport(('xx.xx.xx.xx', xx))
# 用户名和密码
transport.connect(username='用户名', password='密码')

sftp = paramiko.SFTPClient.from_transport(transport)


def getRemoteFiles(remoteDir):
    # 加载 sftp 服务器文件对象(根目录):
    filesAttr = sftp.listdir_attr(remoteDir)
    try:
        # foreach遍历
        for fileAttr in filesAttr:
            # 文件最后修改时间,精确到天yyyy mm dd
            file_dt = datetime.datetime.fromtimestamp(
                fileAttr.st_mtime).strftime('%Y%m%d')
            # 判断是否为目录
            if stat.S_ISDIR(fileAttr.st_mode):
                # 1、当是文件夹时
                # 计算子文件夹在ftp服务器上的路径
                son_remoteDir = remoteDir + '/' + filesAttr.filename
                # 生成器,迭代调用函数自身
                yield from getRemoteFiles(son_remoteDir)
            else:
                # 2、当是文件时
                # 生成器,添加"路径+文件名"到迭代器
                yield remoteDir + '/' + fileAttr.filename
    except Exception as e:
        logging.info('getAllFilePath exception:{}'.format(e))


def download_file(localDir, remoteDir):
    # 记录下载开始时间
    dt_start = datetime.datetime.now().strftime("%Y%m%d%H%M%S")
    logging.info('................. {}开始下载!................\n'.format(dt_start))

    # 判断输入的本地目录是否存在
    if not os.path.exists(localDir):
        # 若本地目录不存在,则创建该目录
        os.makedirs(localDir)

    # 实例化生成器,获取sftp指定目录下的所有文件路径
    files = getRemoteFiles(remoteDir)

    # foreach遍历
    for file in files:
        # 要下载的远程文件,本地时路径+文件名
        remoteFileName = file
        # 定义下载保存到本地时的路径+文件名
        localpathName = os.path.join(localDir, dt_start)
        if not os.path.exists(localpathName):
            os.makedirs(localpathName)
        localFileName = os.path.join(localpathName, file.split('/')[-1])
        try:
            sftp.get(remoteFileName, localFileName)
            logging.info('sftp服务器 {} 下载成功!\n 该文件保存本地位置是{} ! \n'.format(
                remoteFileName, localFileName))
        except Exception as e:
            logging.info('{}下载出错!{}:\n'.format(remoteFileName, e))
            # 下载失败,关闭链接
            sftp.close()

    # 下载成功,关闭链接
    #sftp.close()
    # 记录下载结束时间
    logging.info('..................... {} 下载完成!..................'.format(dt_start))


scheduler = sched.scheduler(time.time, time.sleep)


def run_program():
    logging.info('Running....')
    download_file(r"D:\me\data", "服务器中文件夹地址")


def schedule_program(s):
    scheduler.enter(s * 60, 1, run_program, ())
    scheduler.run()


schedule_program(0)
while True:
    schedule_program(5)
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值