使用 Python 从 SFTP 服务器下载时不要下载空文件夹
Do not download empty folders while downloading from SFTP server using Python
我在本网站的 Python 中获得了递归下载文件的代码。此代码还会下载服务器上的空目录。
请帮助我修改此代码,使其不会从服务器下载空目录。
我的代码(基于):
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)
您可以延迟创建本地目录,直到您在那里遇到要下载的文件:
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)
试试这个
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)
我在本网站的 Python 中获得了递归下载文件的代码。此代码还会下载服务器上的空目录。
请帮助我修改此代码,使其不会从服务器下载空目录。
我的代码(基于
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)
您可以延迟创建本地目录,直到您在那里遇到要下载的文件:
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)
试试这个
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)