Не загружайте пустые папки при загрузке с SFTP-сервера с использованием Python

У меня есть код для рекурсивной загрузки файлов на Python на этом сайте. Этот код также загружает пустые каталоги на сервер.

Пожалуйста, помогите мне изменить этот код, чтобы он не загружал с сервера пустые каталоги.

Код, который у меня есть (на основе Python pysftp get_r из Linux, отлично работает в Linux, но не в Windows):

import os
import pysftp
from stat import S_IMODE, S_ISDIR, S_ISREG

cnopts = pysftp.CnOpts()
cnopts.hostkeys = None    
sftp=pysftp.Connection('192.168.X.X', username='username',password='password',cnopts=cnopts)

def get_r_portable(sftp, remotedir, localdir, preserve_mtime=False):
    for entry in sftp.listdir(remotedir):
        remotepath = remotedir + "/" + entry
        localpath = os.path.join(localdir, entry)
        mode = sftp.stat(remotepath).st_mode
        if S_ISDIR(mode):
            try:
                os.mkdir(localpath,mode=777)
            except OSError:     
                pass
            get_r_portable(sftp, remotepath, localpath, preserve_mtime)
        elif S_ISREG(mode):
            sftp.get(remotepath, localpath, preserve_mtime=preserve_mtime)

remote_path=input("enter the remote_path: ")
local_path=input("enter the local_path: ")

get_r_portable(sftp, remote_path, local_path, preserve_mtime=False)

person udit kanotra    schedule 28.05.2019    source источник


Ответы (2)


Вы можете отложить создание локального каталога до тех пор, пока не найдете там файл, который хотите загрузить:

from stat import S_ISDIR, S_ISREG
def get_r_portable(sftp, remotedir, localdir, preserve_mtime=False):
    for entry in sftp.listdir(remotedir):
        remotepath = remotedir + "/" + entry
        localpath = os.path.join(localdir, entry)
        mode = sftp.stat(remotepath).st_mode
        if S_ISDIR(mode):
            get_r_portable(sftp, remotepath, localpath, preserve_mtime)
        elif S_ISREG(mode):
            os.makedirs(localdir, exist_ok=True)
            sftp.get(remotepath, localpath, preserve_mtime=preserve_mtime)
person Martin Prikryl    schedule 28.05.2019
comment
Этот код не работает в некоторых случаях, когда есть файл типа / tmp / a / b / c / file. - person Guru Vishnu Vardhan Reddy; 28.05.2019
comment
@GuruVishnuVardhanReddy Хорошо, правда. Я это исправил. - person Martin Prikryl; 28.05.2019
comment
Да, os.makedirs с exist_ok = True отлично работает вместо os.mkdir - person Guru Vishnu Vardhan Reddy; 28.05.2019

Попробуй это

import os
import pysftp
from stat import S_IMODE, S_ISDIR, S_ISREG

cnopts = pysftp.CnOpts()
cnopts.hostkeys = None    
sftp=pysftp.Connection('192.168.X.X', username='username',password='password',cnopts=cnopts)

def get_r_portable(sftp, remotedir, localdir, preserve_mtime=False):
    no_of_entries=0;
    for entry in sftp.listdir(remotedir):
        remotepath = remotedir + "/" + entry
        localpath = os.path.join(localdir, entry)
        mode = sftp.stat(remotepath).st_mode
        if S_ISDIR(mode):
            try:
                os.mkdir(localpath,mode=777)
            except OSError:
                pass
            sub = get_r_portable(sftp, remotepath, localpath, preserve_mtime);
            if(sub==0):
                os.rmdir(localpath);
            else:
                no_of_entries+=sub;
        elif S_ISREG(mode):
            sftp.get(remotepath, localpath, preserve_mtime=preserve_mtime);
            no_of_entries+=1;
    return no_of_entries;

remote_path=input("enter the remote_path: ")
local_path=input("enter the local_path: ")

get_r_portable(sftp, remote_path, local_path, preserve_mtime=False)
person Guru Vishnu Vardhan Reddy    schedule 28.05.2019