使用Pysftp从Windows传输文件时文件夹名称出错

时间:2016-10-10 20:00:12

标签: python pysftp

我正在使用Pysftp将文件从Windows服务器传输到Buffalo Terastation。我希望能够告诉它使用PUT_R命令传输文件夹中的所有文件,但是当我运行我的代码时,文件传输奇怪。

我的代码:

srv.put_r('c:/temp1/photos', 'array1/test_sftp/photos', preserve_mtime=True)

当我运行代码时,我在Terastation上获得了类似

的文件名
photos\.\image1.jpg
photos\.\image2.jpg

我猜这段代码没有正确处理平台之间的路径。我该如何纠正这些路径?

我试过了

dest = dest.replace('\\.\\','/')

但是我得到了一个"没有这样的文件"错误

2 个答案:

答案 0 :(得分:1)

我为这个问题创建了一个hacky解决方法。它不是很聪明,在所有情况下都可能不稳定。因此,请小心使用。使用pysftp 0.2.9在Python 3.x上测试。

import os
import pysftp

# copy all folders (non-recursively) from from_dir (windows file system) to to_dir (linux file system)
def copy_files(host, user, pw, from_dir, to_dir):
    cnopts = pysftp.CnOpts()
    cnopts.hostkeys = None
    with pysftp.Connection(host=host, username=user, password=pw, cnopts=cnopts) as sftp:
        from_dir = os.path.normpath(from_dir)
        to_dir = "/" + os.path.normpath(to_dir).replace("\\", "/").strip("/")
        top_folder = os.path.split(to_dir)[1]
        files = [file for file in os.listdir(from_dir) if os.path.isfile(os.path.join(from_dir, file))]
        for file in files:
            sftp.cwd(to_dir)
            sftp.put(os.path.join(from_dir, file), os.path.join("./{}".format(top_folder), file))
            sftp.execute(r'mv "{2}/{0}\{1}" "{2}/{1}"'.format(top_folder, file, to_dir))

# usage: always use full paths for all directories
copy_files("hostname", "username", "password", "D:/Folder/from_folder", "/root/Documents/to_folder")

答案 1 :(得分:0)

通过(临时)更改到本地计算机上的源目录,遍历文件然后使用put()而不是put_r()来使其工作。但是,您需要确保远程目录已经存在。

这是一些示例代码:

import os
import pysftp

cnopts = pysftp.CnOpts()
cnopts.hostkeys = None
srv = pysftp.Connection(host=host, username=username, password=password, cnopts=cnopts)

local_folder = 'c:/temp1/photos'
remote_folder = 'array1/test_sftp/photos'

with pysftp.cd(local_folder):
    srv.cwd(remote_folder)
    for filename in os.listdir('.'):
        srv.put(filename, preserve_mtime=True)