我试图使用以下结构从SFTP中获取:
main_dir/
dir1/
file1
dir2/
file2我试图通过以下命令来实现这一点:
sftp.get_r(main_path + dirpath, local_path)或
sftp.get_d(main_path + dirpath, local_path)本地路径类似于d:/grabbed_files/target_dir,而远程路径类似于/data/some_dir/target_dir。
使用get_r,我得到了FileNotFound异常。使用get_d,我得到的是空的dir (当目标dir有文件而不是dir时,它工作得很好)。
我完全相信这个目录就在这个路径上。我做错了什么?
发布于 2016-11-15 12:41:36
我不明白为什么它不能工作,所以我以我自己的递归解决方案结束了:
def grab_dir_rec(sftp, dirpath):
local_path = target_path + dirpath
full_path = main_path + dirpath
if not sftp.exists(full_path):
return
if not os.path.exists(local_path):
os.makedirs(local_path)
dirlist = sftp.listdir(remotepath=full_path)
for i in dirlist:
if sftp.isdir(full_path + '/' + i):
grab_dir_rec(sftp, dirpath + '/' + i)
else:
grab_file(sftp, dirpath + '/' + i)发布于 2018-08-28 17:06:41
这个对我有用,但是当你下载目录时,它会在本地创建完整的路径。
pysftp.Connection.get_r()我还创建了简单的download和upload方法:
def download_r(sftp, outbox):
tmp_dir = helpers.create_tmpdir()
assert sftp.isdir(str(outbox))
assert pathlib.Path(tmp_dir).is_dir()
sftp.get_r(str(outbox), str(tmp_dir))
tmp_dir = tmp_dir / outbox
return tmp_dir
def upload_r(sftp, inbox, files):
assert sftp.isdir(str(inbox))
if pathlib.Path(files).is_dir():
logger.debug(list(files.iterdir()))
sftp.put_r(str(files), str(inbox))
else:
logger.debug('No files here.')发布于 2016-11-28 22:44:52
如果您希望在pysftp周围设置一个上下文管理器包装器(用于此操作),则下面的解决方案代码更少(在您复制/粘贴github gist之后),该解决方案在使用时看起来如下所示
path = "sftp://user:password@test.com/path/to/file.txt"
# Read a file
with open_sftp(path) as f:
s = f.read()
print s
# Write to a file
with open_sftp(path, mode='w') as f:
f.write("Some content.") (更完整的)示例:http://www.prschmid.com/2016/09/simple-opensftp-context-manager-for.html
这个上下文管理器碰巧有自动重试逻辑,当您无法第一次连接时(这比您在生产环境中预期的要频繁得多…)。
哦,是的,这假设每个连接只有一个文件,因为它会自动关闭ftp连接。
open_sftp:https://gist.github.com/prschmid/80a19c22012e42d4d6e791c1e4eb8515的上下文管理器要点
https://stackoverflow.com/questions/40608644
复制相似问题