【问题标题】:paramiko upload folder via sftpparamiko 通过 sftp 上传文件夹
【发布时间】:2014-08-15 13:09:06
【问题描述】:

在我的工作代码中,我有这个

import paramiko
parent=os.path.split(dir_local)[1]
for walker in os.walk(parent):
    try:
        self.sftp.mkdir(os.path.join(dir_remote,walker))
    except:
        pass
for file in walker[2]:
    sftp.put(os.path.join(walker[0],file),os.path.join(dir_remote,walker[0],file))

现在显示的错误是

Trying ssh-agent key 5e08bb83615bcc303ca84abe561ef0a6 ... success
Caught exception: <type 'exceptions.IOError'>: [Errno 2] Directory does not exist.

打印walker 显示该文件夹内的所有文件,但我不知道为什么该文件夹不复制到 sftp 服务器

【问题讨论】:

    标签: python ssh sftp paramiko


    【解决方案1】:

    除非你覆盖了os.walk(),否则它会生成一个包含三个对象的元组:dirpath, dirnames, filenames

    所以,你的os.path.join(dir_remote, walker) 调用总是会抛出一个异常,导致你预期的目录没有被创建。

    我发现像这样编写os.walk() 循环更清晰:

    for dirpath, dirnames, filenames in os.walk(parent):
        remote_path = os.path.join(dir_remote, dirpath)
        # make remote directory ...
        for filename in filenames:
            local_path = os.path.join(dirpath, filename)
            remote_fliepath = os.paht.join(remote_path, filename)
            # put file
    

    请记住,os.walk()遍历您给定的parent 中的任何目录。

    【讨论】:

    • 我可以用什么代替 os.walk() ...?
    • 可以使用walk,只要正确使用即可。
    • 如果您只关心单个目录,并且它是直接子目录,请改用os.listdir()
    • 好的,我试过 >os.listdir() .. 它给了我 [Errno 2] 没有这样的文件或目录:'2/1'
    • local_filepaths = [ os.path.join(parent, filename) for filename in os.listdir(parent)]