【问题标题】:Python pysftp download fails with "IOError: [Errno 21] Is a directory"Python pysftp 下载失败并显示“IOError: [Errno 21] Is a directory”
【发布时间】:2019-06-25 04:15:41
【问题描述】:

这是我想要从 SFTP 服务器下载文件到本地的示例 Python 脚本。

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'

错误堆栈;

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'

我在这里做错了什么?

【问题讨论】:

    标签: python sftp pysftp


    【解决方案1】:

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

        with open(localpath, "wb") as fl:
    IOError: [Errno 21] Is a directory: '/Users/ratha/Desktop'
    

    显然,pysftp 尝试将/Users/ratha/Desktop 作为二进制写入文件打开,但效果并不好,因为那已经是一个目录了。 documentation 将确认这一点:

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

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

    【讨论】:

      【解决方案2】:

      您的destination 变量应该包含目标文件的路径,包括文件名。如果目标文件名要与源文件名相同,则可以将源文件名的基名与目标目录连接起来:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-08-22
        • 1970-01-01
        • 2013-05-26
        • 1970-01-01
        • 2015-04-24
        • 2020-03-22
        • 1970-01-01
        相关资源
        最近更新 更多