使用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
相关产品推荐
相关产品推荐

