Python使用shutil、urllib、contextlib下载FTP嵌套目录及全部文件
Python FTP整目录嵌套下载实现方案
你之前使用的urllib方案仅适配单文件下载场景,要实现多层嵌套目录的全量下载,推荐使用Python标准库自带的ftplib,它原生支持FTP目录遍历、文件操作等能力,实现逻辑更清晰。
实现逻辑
- 先建立FTP连接并完成身份验证,匿名FTP可直接使用
anonymous作为用户名,任意邮箱格式字符串作为密码 - 递归遍历远程根目录下的所有内容,区分文件与子目录
- 遇到子目录时,先在本地创建对应层级的目录,再递归进入子目录处理内部内容
- 遇到文件时,直接写入本地对应路径下
完整实现代码
import os from ftplib import FTP def download_ftp_dir(ftp, remote_dir, local_dir): # 切换到远程目标目录 ftp.cwd(remote_dir) # 确保本地对应目录存在 os.makedirs(local_dir, exist_ok=True) # 遍历当前远程目录下的所有内容 for item in ftp.nlst(): # 跳过当前目录和上级目录标识 if item in ('.', '..'): continue try: # 尝试切换到该路径,判断是否为子目录 ftp.cwd(item) # 切换成功说明是子目录,递归处理 download_ftp_dir(ftp, '.', os.path.join(local_dir, item)) # 处理完回到上级目录 ftp.cwd('..') except: # 切换失败说明是文件,执行下载 local_file_path = os.path.join(local_dir, item) with open(local_file_path, 'wb') as f: ftp.retrbinary(f'RETR {item}', f.write) if __name__ == '__main__': # 替换为你的FTP配置 FTP_HOST = '你的FTP服务器地址' FTP_USER = 'FTP用户名' FTP_PASS = 'FTP密码' REMOTE_ROOT_PATH = 'path/to/file' # 要下载的远程根目录 LOCAL_SAVE_PATH = './ftp_download' # 本地保存路径 # 建立FTP连接 ftp = FTP(FTP_HOST) # 登录FTP ftp.login(user=FTP_USER, passwd=FTP_PASS) # 开启被动模式(大部分FTP服务器都需要开启) ftp.set_pasv(True) # 启动全量下载 download_ftp_dir(ftp, REMOTE_ROOT_PATH, LOCAL_SAVE_PATH) # 关闭连接 ftp.quit()
注意事项
- 若下载大文件较多,可以在
retrbinary方法中添加回调函数打印下载进度,方便查看运行状态 - 部分FTP服务器的目录列表返回格式特殊,如果
nlst()方法无法正常识别目录和文件,可以替换为dir()方法结合自定义解析规则处理 - 代码已经兼容Windows和Linux的路径分隔符差异,不需要额外调整路径拼接逻辑
内容的提问来源于stack exchange,提问作者Jsleshem
相关产品推荐
相关产品推荐

