首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用pysftp递归下载

用pysftp递归下载
EN

Stack Overflow用户
提问于 2016-11-15 11:24:30
回答 3查看 3.4K关注 0票数 2

我试图使用以下结构从SFTP中获取:

代码语言:javascript
复制
main_dir/
 dir1/
  file1
 dir2/
  file2

我试图通过以下命令来实现这一点:

代码语言:javascript
复制
sftp.get_r(main_path + dirpath, local_path)

代码语言:javascript
复制
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时,它工作得很好)。

我完全相信这个目录就在这个路径上。我做错了什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-11-15 12:41:36

我不明白为什么它不能工作,所以我以我自己的递归解决方案结束了:

代码语言:javascript
复制
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)
票数 0
EN

Stack Overflow用户

发布于 2018-08-28 17:06:41

这个对我有用,但是当你下载目录时,它会在本地创建完整的路径。

代码语言:javascript
复制
pysftp.Connection.get_r()

我还创建了简单的downloadupload方法:

代码语言:javascript
复制
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.')
票数 1
EN

Stack Overflow用户

发布于 2016-11-28 22:44:52

如果您希望在pysftp周围设置一个上下文管理器包装器(用于此操作),则下面的解决方案代码更少(在您复制/粘贴github gist之后),该解决方案在使用时看起来如下所示

代码语言:javascript
复制
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的上下文管理器要点

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40608644

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档