繁体   English   中英

如何基于 FTP 文件夹树创建 Python 嵌套字典

[英]How to create a Python nested dictionary based on a FTP tree of folders

我正在尝试基于位于 FTP 服务器上的文件夹树创建字典(见下图):

在此处输入图像描述

我正在寻找的结果是:具有辅助字典(作为键)和一些列表(作为值)的主字典。

rootpath = r'C:\Users\_M92\Desktop\myFolder'

dict = {'subfolder1': ['sub-subfolder1', 'sub-subfolder2', 'sub-subfolder3']}, \
       {'subfolder2': ['sub-subfolder1']}, \
       {'subfolder3': ['sub-subfolder1', 'sub-subfolder2']}

我必须确切地说,子子文件夹最终可以在其中包含一些文件夹。
您对如何进行这种操作有什么建议吗?

编辑:

有了@Elmatador DeAngel 的建议/答案,我们就足够接近了:

dict = {'subfolder1': {'sub-subfolder1': 'Empty', 'sub-subfolder2': 'Empty', 'sub-subfolder3': 'Empty'},\
        'subfolder2': {'sub-subfolder1': 'Empty'},  \
        'subfolder3': {'sub-subfolder1': 'Empty', 'sub-subfolder2': 'Empty'}}

我知道您正在寻找使用 FTPlib 的代码。 我没有 FTP 服务器来显示示例,但我可以提供一些帮助。

您可以使用递归 function 的概念; 一个调用自身的 function。

很简单,使用os.listdir()扫描一个文件夹,然后检查它是否是一个文件夹,如果是,则调用相同的 function 进行相同的操作,并将其添加到字典中。

这是一个简单的例子(没有 FTP):


import os



dictionary = {}

path = "C:/Users/User/Desktop/SomeFile"

def is_dictionary(path): 

       try:
            os.chdir(path)
            return True
            
       except:
            return False
       
def RecursiveFunc(data, path): 
      
      f = os.listdir(path)
      if f != {}:
       for i in f: 
         if is_dictionary(f"{path}/{i}"):
                if os.listdir(f"{path}/{i}") != []:
                   data[i] = {}
                   RecursiveFunc(data[i], f"{path}/{i}")
                  
                else:
                   data[i] = 'Empty'
     
             
                    
RecursiveFunc(dictionary, path)

print(str(dictionary))

你只需要对 FTPlib 库做同样的事情。 You can use FTP.cwd() to move from a dictionary to another, and FTP.nlst() to list all the files in said dictionary, and then call a recursive function to do the same job to the file inside the file.

Output:

{'subfolder1': {'sub-subfolder1': 'Empty', 'sub-subfolder2': 'Empty', 'sub-subfolder3': 'Empty'},
{'subfolder2': {'sub-subfolder1': 'Empty'}, 
{'subfolder3': {'sub-subfolder1': 'Empty', 'sub-subfolder2': 'Empty'}}

编辑

我编写的代码几乎与您想要的 output 非常相似。

这里是:


import os

dictionary = []

path = "C:/Users/User/Desktop/MyFolder"

def is_dic(path): 

       try:
            os.chdir(path)
            return True
            
       except:
            return False
       
def RecursiveFunc(data, path): 
      
      f = os.listdir(path)
      index = 0
      for i in f:
          
           if is_dic(f"{path}/{i}"):
               if os.listdir(f"{path}/{i}") == []: 
                          data.append(str(i))
                          
                          
               else:
               
                       data.append({i: []})
                       RecursiveFunc(data[index][i], f"{path}/{i}" )
               
               index += 1               
     
             
                          
                          

                      
RecursiveFunc(dictionary, path)


print(str(dictionary))

Output:

[{'subfolder1': ['sub-subfolder1', 'sub-subfolder2', 'sub-subfolder3']}, 
{'subfolder2': ['sub-subfolder1']}, 
{'subfolder3': ['sub-subfolder1', 'sub-subfolder2']}]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM