繁体   English   中英

使用pysftp递归下载

[英]Recursive download with pysftp

我正在尝试使用以下结构从 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我得到空目录(当目标目录的文件不是目录时,它工作正常)。

我完全确定该目录存在于该路径中。 我究竟做错了什么?

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

pysftp.Connection.get_r()

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

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.')

我不明白为什么它不起作用所以我以我自己的递归解决方案结束:

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)

如果你想要一个围绕 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM