我正在使用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('\\.\\','/')
但是我得到了一个"没有这样的文件"错误
答案 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)