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

Python 3.X中能否通过FTP传输含子文件夹的目录?

Python 3.X 下通过FTP传输含子文件夹的目录实现方案

完全可行,Python 3.X自带的ftplib库就能实现递归传输包含子文件夹和文件的目录,批量传输也能高效完成。以下是具体实现方法:

实现思路

递归遍历本地目标目录的所有内容:遇到子文件夹时,先在FTP服务器上创建对应路径,再进入该文件夹继续遍历;遇到文件时,直接上传到对应远程路径。

完整代码示例

from ftplib import FTP
import os

def upload_recursive(ftp, local_dir, remote_dir):
    # 切换或创建远程目录
    try:
        ftp.cwd(remote_dir)
    except:
        ftp.mkd(remote_dir)
        ftp.cwd(remote_dir)
    
    # 遍历本地目录项
    for entry in os.scandir(local_dir):
        local_path = entry.path
        remote_entry_name = entry.name
        
        if entry.is_dir(follow_symlinks=False):
            # 递归上传子文件夹
            upload_recursive(ftp, local_path, f"{remote_dir}/{remote_entry_name}")
            ftp.cwd("..")  # 返回上级目录
        else:
            # 上传文件
            with open(local_path, "rb") as file_obj:
                ftp.storbinary(f"STOR {remote_entry_name}", file_obj)
            print(f"Uploaded: {local_path} -> {remote_dir}/{remote_entry_name}")

if __name__ == "__main__":
    # 配置参数
    FTP_HOST = "your_ftp_server_address"
    FTP_USER = "your_username"
    FTP_PASS = "your_password"
    LOCAL_TARGET_DIR = "/path/to/your/local/folder"
    REMOTE_TARGET_DIR = "/path/on/ftp/server"

    # 连接并上传
    with FTP(FTP_HOST) as ftp:
        ftp.login(FTP_USER, FTP_PASS)
        # 开启被动模式(多数场景下需要,避免防火墙拦截)
        ftp.set_pasv(True)
        print("Connected to FTP server successfully")
        
        upload_recursive(ftp, LOCAL_TARGET_DIR, REMOTE_TARGET_DIR)
        print("Directory upload completed")

关键注意事项

  • 权限验证:确保FTP账号拥有目标远程目录的创建、写入权限
  • 被动模式:默认主动模式可能被防火墙拦截,建议开启ftp.set_pasv(True)
  • 批量传输多个目录:如果需要上传多个独立目录,只需循环调用upload_recursive函数,传入不同的本地/远程路径即可
  • 大文件处理:storbinary采用流式传输,无需担心大文件内存占用问题

内容的提问来源于stack exchange,提问作者Vulturu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 10:43:19