使用Paramiko/pysftp向Lambda传文件触发IsADirectoryError求助
错误原因分析及解决方案
核心错误原因
pysftp的get方法不允许localpath参数直接指定目录,它要求传入具体的目标文件名而非目录路径。你当前把localpath设为/temp/upload(云监控日志显示实际是/tmp/upload,属于代码笔误),这是一个目录,因此触发IsADirectoryError。
远程路径报错的可能原因:
filesList中包含了目录名称而非文件名,导致拼接后的远程路径指向目录- 手动拼接路径时出错(比如
ftp_filepath结尾无斜杠,导致路径变成/home/mmoradi2/datafile.txt这类错误格式)
修复步骤
1. 修正本地路径参数
调用get时必须指定具体文件名,将本地目录与文件名拼接:
import os import pysftp cnopts = pysftp.CnOpts() cnopts.hostkeys = None # Lambda临时目录为/tmp,修正代码中的路径笔误 local_base_dir = '/tmp/upload/' # 确保本地目录存在,Lambda的/tmp目录可写,但需提前创建 os.makedirs(local_base_dir, exist_ok=True) with pysftp.Connection(host=host, username=user, password=password, port=22, cnopts=cnopts) as sftp: sftp.chdir(ftp_filepath) for file in filesList: # 用os.path.join安全拼接路径,避免手动拼接的格式错误 sftp_remote_path = os.path.join(ftp_filepath, file) local_file_path = os.path.join(local_base_dir, file) sftp.get(sftp_remote_path, localpath=local_file_path, preserve_mtime=True)
2. 确保远程路径指向文件
- 检查
filesList元素是否均为文件名,若需下载整个目录,改用get_d方法:
# 下载整个远程目录到本地目录,注意参数顺序为远程目录在前、本地目录在后 sftp.get_d(remote_dir=ftp_filepath, local_dir=local_base_dir, preserve_mtime=True)
3. 路径拼接最佳实践
始终用os.path.join拼接路径,避免手动添加斜杠导致的格式错误,适配不同目录结构场景。
内容的提问来源于stack exchange,提问作者user22990221
相关产品推荐
相关产品推荐

