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)
从服务器中每隔5分钟下载数据到本地
最新推荐文章于 2024-07-20 18:38:43 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)