2

我正在使用 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('\\.\\','/')

但我收到“没有这样的文件”错误

4

2 回答 2

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")
于 2017-09-07T09:38:05.417 回答
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)
于 2019-03-26T10:14:49.487 回答