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
相关产品推荐
相关产品推荐

