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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 03:18:01