You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python pysftp将SFTP文件下载至指定本地目录报错求助

问题分析与解决方案

你报错的原因是用错了getfo()的参数:getfo()的第二个参数fl需要传入的是一个已打开的文件对象,而不是目录路径。下面给你两种可行的实现方案:


方案1:用sftp.get()直接下载(推荐)

get()方法是pysftp中更常用的文件下载方式,直接支持指定本地文件的完整路径,用法更简单:

import os
import pysftp

# 设定本地目标目录
directory1 = r'C:\Users\Me\Documents\test sftp'
# 确保目录存在,不存在则自动创建
os.makedirs(directory1, exist_ok=True)

# 建立SFTP连接
cnopts = pysftp.CnOpts()
cnopts.hostkeys = None  # 注意:生产环境不建议禁用hostkey验证,安全风险高
with pysftp.Connection(host=hostname, username=usereu, password=passeu, cnopts=cnopts) as sftp:
    print("Connection successfully established ... ")
    # 获取远程目录下的所有文件
    files = sftp.listdir()
    for file in files:
        # 拼接本地文件的完整路径
        local_file_path = os.path.join(directory1, file)
        # 下载文件到指定路径
        sftp.get(remotepath=file, localpath=local_file_path)
        print(f"{file} downloaded successfully ")

关键说明:

  • os.path.join()自动处理Windows/ Linux的路径分隔符,避免手动拼接出错
  • os.makedirs(..., exist_ok=True)确保目标目录存在,防止因目录缺失导致下载失败
  • 使用with语句管理SFTP连接,会自动关闭连接,避免资源泄漏

方案2:正确使用sftp.getfo()方法

如果你一定要用getfo(),需要先在本地创建并打开一个文件对象,再把这个对象传给fl参数:

import os
import pysftp

directory1 = r'C:\Users\Me\Documents\test sftp'
os.makedirs(directory1, exist_ok=True)

cnopts = pysftp.CnOpts()
cnopts.hostkeys = None
with pysftp.Connection(host=hostname, username=usereu, password=passeu, cnopts=cnopts) as sftp:
    print("Connection successfully established ... ")
    files = sftp.listdir()
    for file in files:
        local_file_path = os.path.join(directory1, file)
        # 以二进制写入模式打开本地文件
        with open(local_file_path, 'wb') as local_file:
            # 将远程文件内容写入本地文件对象
            sftp.getfo(remotepath=file, fl=local_file)
        print(f"{file} downloaded successfully ")

关键说明:

getfo()的设计目的是将远程文件内容写入一个已打开的文件对象(比如内存中的BytesIO),而非直接指定目录路径,所以必须先创建本地文件对象。


内容的提问来源于stack exchange,提问作者Tyler Moore

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 11:55:23