如何基于FTP文件夹树结构创建Python嵌套字典
基于FTP文件夹树生成指定结构字典的实现方案
需求说明
需要基于FTP服务器上的文件夹树(结构如下图),生成一个主字典:键为根目录下的一级子文件夹名称,值为该一级子文件夹下所有直接子子文件夹的名称列表(即使子子文件夹内部还包含其他文件夹,也仅提取当前层级的名称)。

期望的目标字典结构示例:
rootpath = r'C:\Users\_M92\Desktop\myFolder' target_dict = { 'subfolder1': ['sub-subfolder1', 'sub-subfolder2', 'sub-subfolder3'], 'subfolder2': ['sub-subfolder1'], 'subfolder3': ['sub-subfolder1', 'sub-subfolder2'] }
此前尝试结果
此前参考相关方法得到了接近目标的结果,但输出为嵌套字典形式,不符合需求:
result_dict = { 'subfolder1': {'sub-subfolder1': 'Empty', 'sub-subfolder2': 'Empty', 'sub-subfolder3': 'Empty'}, 'subfolder2': {'sub-subfolder1': 'Empty'}, 'subfolder3': {'sub-subfolder1': 'Empty', 'sub-subfolder2': 'Empty'} }
实现方案
核心思路
- 连接FTP服务器并完成登录验证;
- 切换到目标根目录;
- 筛选出根目录下的所有一级子文件夹;
- 遍历每个一级子文件夹,获取其下所有直接子文件夹的名称;
- 将一级子文件夹名作为键,对应子文件夹名称列表作为值存入目标字典;
- 操作完成后关闭FTP连接。
代码示例
from ftplib import FTP def ftp_folder_to_dict(ftp_host, ftp_user, ftp_pass, root_path): target_dict = {} ftp = FTP(ftp_host) ftp.login(ftp_user, ftp_pass) # 切换到目标根目录 ftp.cwd(root_path) # 定义判断是否为文件夹的逻辑(根据FTP服务器返回特性调整) def is_folder(item): try: # 若能获取文件大小则为文件,否则为文件夹 ftp.size(item) return False except: return True # 获取根目录下的所有一级子文件夹 first_level_folders = [item for item in ftp.nlst() if is_folder(item)] for folder in first_level_folders: ftp.cwd(folder) # 获取当前文件夹下的直接子文件夹 sub_folders = [sub_item for sub_item in ftp.nlst() if is_folder(sub_item)] target_dict[folder] = sub_folders # 返回上一级目录 ftp.cwd('..') ftp.quit() return target_dict # 调用示例(替换为你的FTP信息) ftp_host = "你的FTP服务器地址" ftp_user = "你的FTP用户名" ftp_pass = "你的FTP密码" root_path = "/目标根文件夹路径" final_result = ftp_folder_to_dict(ftp_host, ftp_user, ftp_pass, root_path) print(final_result)
注意事项
- 不同FTP服务器的文件/文件夹标识逻辑可能不同,
is_folder函数的判断逻辑需根据实际情况调整(比如部分服务器可通过ftp.dir获取详细权限信息来区分文件和文件夹); - 代码会自动过滤根目录下的文件,仅保留一级子文件夹;
- 遍历过程中会自动返回上一级目录,避免目录切换混乱;
- 无论子子文件夹内部是否有嵌套,仅提取当前层级的文件夹名称,完全符合需求。
内容的提问来源于stack exchange,提问作者Timeless
相关产品推荐
相关产品推荐

