Python pysftp download fails with "IOError: [Errno 21] Is a directory"
Python pysftp download fails with "IOError: [Errno 21] Is a directory"
这是我的示例 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] Is a directory: '/Users/ratha/Desktop'
错误堆栈;
Traceback (most recent call last):
File "/Users/ratha/PycharmProjects/SFTPDownloader/handler.py", line 9, in <module>
main()
File "/Users/ratha/PycharmProjects/SFTPDownloader/handler.py", line 5, in main
downloadSFTPFiles()
File "/Users/ratha/PycharmProjects/SFTPDownloader/Utilities/SFTPConnector.py", line 49, in downloadSFTPFiles
srv.get(infile, destination, preserve_mtime=True)
File "/Users/ratha/PycharmProjects/SFTPDownloader/venv/lib/python2.7/site-packages/pysftp/__init__.py", line 249, in get
self._sftp.get(remotepath, localpath, callback=callback)
File "/Users/ratha/PycharmProjects/SFTPDownloader/venv/lib/python2.7/site-packages/paramiko/sftp_client.py", line 801, in get
with open(localpath, "wb") as fl:
IOError: [Errno 21] Is a directory: '/Users/ratha/Desktop'
我这里哪里做错了?
堆栈跟踪实际上非常清楚。只关注这两行:
with open(localpath, "wb") as fl:
IOError: [Errno 21] Is a directory: '/Users/ratha/Desktop'
显然,pysftp
试图打开 /Users/ratha/Desktop
作为二进制写入的文件,但并不顺利,因为它已经是一个目录。 documentation 将确认这一点:
localpath (str) – the local path and filename to copy, destination. If not specified, file is copied to local current working directory
因此您需要弄清楚要另存为的文件名,并使用(最佳实践)os.path.join('/Users/ratha/Desktop', filename)
获取路径和文件名,而不仅仅是路径。
您的 destination
变量应该包含目标文件的路径,包括文件名。如果目标文件名要与源文件名相同,可以将源文件名的基名与目标目录连接起来:
import os
...
srv.get(infile, os.path.join(destination, os.path.basename(infile)), preserve_mtime=True)
这是我的示例 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] Is a directory: '/Users/ratha/Desktop'
错误堆栈;
Traceback (most recent call last):
File "/Users/ratha/PycharmProjects/SFTPDownloader/handler.py", line 9, in <module>
main()
File "/Users/ratha/PycharmProjects/SFTPDownloader/handler.py", line 5, in main
downloadSFTPFiles()
File "/Users/ratha/PycharmProjects/SFTPDownloader/Utilities/SFTPConnector.py", line 49, in downloadSFTPFiles
srv.get(infile, destination, preserve_mtime=True)
File "/Users/ratha/PycharmProjects/SFTPDownloader/venv/lib/python2.7/site-packages/pysftp/__init__.py", line 249, in get
self._sftp.get(remotepath, localpath, callback=callback)
File "/Users/ratha/PycharmProjects/SFTPDownloader/venv/lib/python2.7/site-packages/paramiko/sftp_client.py", line 801, in get
with open(localpath, "wb") as fl:
IOError: [Errno 21] Is a directory: '/Users/ratha/Desktop'
我这里哪里做错了?
堆栈跟踪实际上非常清楚。只关注这两行:
with open(localpath, "wb") as fl:
IOError: [Errno 21] Is a directory: '/Users/ratha/Desktop'
显然,pysftp
试图打开 /Users/ratha/Desktop
作为二进制写入的文件,但并不顺利,因为它已经是一个目录。 documentation 将确认这一点:
localpath (str) – the local path and filename to copy, destination. If not specified, file is copied to local current working directory
因此您需要弄清楚要另存为的文件名,并使用(最佳实践)os.path.join('/Users/ratha/Desktop', filename)
获取路径和文件名,而不仅仅是路径。
您的 destination
变量应该包含目标文件的路径,包括文件名。如果目标文件名要与源文件名相同,可以将源文件名的基名与目标目录连接起来:
import os
...
srv.get(infile, os.path.join(destination, os.path.basename(infile)), preserve_mtime=True)