如何使用Python Paramiko从SFTP服务器下载目录下特定文件
Paramiko实现SFTP指定文件下载方案
核心逻辑
你已经调通了目录全量文件列表获取逻辑,不需要改动现有连接、认证部分的代码,只需要在遍历文件列表环节增加自定义筛选规则,仅对命中规则的文件调用下载接口即可。
常见的筛选规则包括:精确匹配文件名、匹配文件后缀、匹配文件名关键词、按文件大小/修改时间过滤、正则匹配文件名。
可复用代码示例
import paramiko import os import posixpath # 用于拼接远程SFTP路径,兼容Windows本地开发环境 # --------------- 以下连接部分可直接替换为你已调通的代码 --------------- transport = paramiko.Transport(('SFTP服务器地址', 22)) transport.connect(username='账号', password='密码') sftp = paramiko.SFTPClient.from_transport(transport) # 路径配置 remote_target_dir = '/远程目标目录路径' local_save_dir = '/本地文件存储目录' os.makedirs(local_save_dir, exist_ok=True) # --------------- 自定义筛选规则配置 --------------- # 1. 精确匹配文件名:只下载列表内的文件 target_exact_files = {'daily_report_2024.csv', 'system_config.json'} # 2. 后缀匹配:只下载指定后缀的文件 allow_suffix = ('.csv', '.log', '.xlsx') # 3. 关键词匹配:只下载文件名包含指定关键词的文件 contain_keyword = '2024Q3' # 遍历目录下所有条目 for entry in sftp.listdir_attr(remote_target_dir): # 跳过子目录,仅处理普通文件 if entry.st_mode & 0o40000: continue filename = entry.filename is_match = False # 按需启用筛选规则,多规则可通过and/or组合 # 规则1:精确文件名匹配 if filename in target_exact_files: is_match = True # 规则2:后缀匹配 # if filename.endswith(allow_suffix): # is_match = True # 规则3:关键词匹配 # if contain_keyword in filename: # is_match = True # 规则4:正则匹配示例(需要先import re) # if re.match(r'report_\d{8}\.csv', filename): # is_match = True # 命中规则才执行下载 if is_match: remote_file_path = posixpath.join(remote_target_dir, filename) local_file_path = os.path.join(local_save_dir, filename) sftp.get(remote_file_path, local_file_path) print(f"指定文件下载完成:{filename}") # 关闭连接 sftp.close() transport.close()
注意事项
- 拼接远程路径时优先用
posixpath.join,避免本地是Windows环境时,os.path.join生成带反斜杠的路径,导致SFTP侧找不到文件 - 如果需要遍历多层嵌套子目录,遇到目录条目时递归执行遍历逻辑即可,筛选、下载部分的代码不需要修改
- 大文件下载可给
sftp.get()传入callback参数,实时获取已下载字节数实现进度展示,不影响筛选逻辑 - 如果需要按文件修改时间筛选,直接读取
entry.st_mtime字段做时间判断即可,和本地文件的属性判断逻辑一致
内容的提问来源于stack exchange,提问作者TTG
相关产品推荐
相关产品推荐

