Python PySTFP下载失败,返回“0”;IOError:[Errno 21]是一个目录";

Python PySTFP下载失败,返回“0”;IOError:[Errno 21]是一个目录";,python,sftp,pysftp,Python,Sftp,Pysftp,这是我的示例Python脚本,我想在这里将文件从SFTP服务器下载到本地服务器 srv = pysftp.Connection(host=host, username=username, password=password, port=port, cnopts=connOption) with srv.cd(sftppath): data = srv.listdir() try: for infile in data:

这是我的示例Python脚本,我想在这里将文件从SFTP服务器下载到本地服务器

srv = pysftp.Connection(host=host, username=username, password=password, port=port, cnopts=connOption)
    with srv.cd(sftppath):
        data = srv.listdir()
        try:
            for infile in data:
                print infile
                srv.get(infile, destination, preserve_mtime=True)
我可以成功连接,它会列出文件夹中的所有文件。但是当我使用
srv.get()
下载到我的桌面时,我得到了以下错误:

IOError:[Errno 21]是一个目录:'/Users/ratha/Desktop'

误差叠加

回溯(最近一次呼叫最后一次):
文件“/Users/ratha/PycharmProjects/SFTPDownloader/handler.py”,第9行,在
main()
文件“/Users/ratha/PycharmProjects/SFTPDownloader/handler.py”,第5行,在main中
下载sftpfiles()
文件“/Users/ratha/PycharmProjects/SFTPDownloader/Utilities/SFTPConnector.py”,第49行,下载sftpfiles
srv.get(填充、目标、保留时间=True)
文件“/Users/ratha/PycharmProjects/SFTPDownloader/venv/lib/python2.7/site packages/pysftp/__init__.py”,get中第249行
self.\u sftp.get(远程路径、本地路径、回调=回调)
文件“/Users/ratha/PycharmProjects/SFTPDownloader/venv/lib/python2.7/site packages/paramiko/sftp_client.py”,第801行,在get中
以open(localpath,“wb”)作为fl:
IOError:[Errno 21]是一个目录:'/Users/ratha/Desktop'

我做错了什么?

堆栈跟踪实际上非常清晰。只需关注这两条线:

以open(localpath,“wb”)作为fl:
IOError:[Errno 21]是一个目录:'/Users/ratha/Desktop'
显然,
pysftp
试图将
/Users/ratha/Desktop
作为二进制写入的文件打开,但操作不顺利,因为它已经是一个目录了。委员会将确认这一点:

localpath(str)–要复制的本地路径和文件名,目标。如果未指定,则将文件复制到本地当前工作目录


因此,您需要找出要另存为的文件名,并使用(最佳做法)
os.path.join('/Users/ratha/Desktop',filename)
获取路径和文件名,而不仅仅是路径。

堆栈跟踪实际上非常清晰。只需关注这两条线:

以open(localpath,“wb”)作为fl:
IOError:[Errno 21]是一个目录:'/Users/ratha/Desktop'
显然,
pysftp
试图将
/Users/ratha/Desktop
作为二进制写入的文件打开,但操作不顺利,因为它已经是一个目录了。委员会将确认这一点:

localpath(str)–要复制的本地路径和文件名,目标。如果未指定,则将文件复制到本地当前工作目录


因此,您需要找出要另存为的文件名,并使用(最佳做法)
os.path.join('/Users/ratha/Desktop',filename)
来获取路径和文件名,而不仅仅是路径。

您的
destination
变量应该包含目标文件的路径和文件名。如果目标文件名与源文件名相同,则可以将源文件名的基名称与目标目录合并:

import os

...

srv.get(infile, os.path.join(destination, os.path.basename(infile)), preserve_mtime=True)

destination
变量应包含目标文件的路径,并包含文件名。如果目标文件名与源文件名相同,则可以将源文件名的基名称与目标目录合并:

import os

...

srv.get(infile, os.path.join(destination, os.path.basename(infile)), preserve_mtime=True)