I got a code to download files recursively in Python on this site. This code also downloads empty directories on server also.
Please help me to modify this code so that it does not download empty directories from the server.
Code I have (based on Python pysftp get_r from Linux works fine on Linux but not on 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)
You can delay creating a local directory, until you encounter a file you want to download there:
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)
Try this
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)
来源:https://stackoverflow.com/questions/56337086/do-not-download-empty-folders-while-downloading-from-sftp-server-using-python