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

enter image description here

我正在寻找的结果是:一个主词典,它有辅助词典(作为键)和一些列表(作为值).

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

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

I have to precise that the sub-subfolders can eventually have some folders within.
Do you have any suggestions how to reach this kind of operations, please ?

编辑:

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

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

推荐答案

我知道您正在寻找使用FTPlib的代码.我没有一个可以展示这个例子的ftp服务器,但我可以提供一些帮助.

您可以使用递归函数的概念;即调用自身的函数.

这很简单,用os.listdir()扫描一个文件夹,然后判断它是否是一个文件夹,如果是,那么调用相同的函数来执行相同的操作,并将其添加到词典中.

下面是一个简单的例子(不带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库执行同样的操作.您可以使用FTP.cwd()从一个字典移动到另一个字典,使用FTP.nlst()列出该字典中的所有文件,然后调用递归函数对文件中的文件执行相同的工作.

输出:

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

EDIT

我编写的代码几乎与您想要的输出完全相似.

它是这样的:


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))

输出:

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

Python相关问答推荐

2维数组9x9,不使用numpy.数组(MutableSequence的子类)

根据不同列的值在收件箱中移动数据

当多个值具有相同模式时返回空

Pytest两个具有无限循环和await命令的Deliverc函数

沿着数组中的轴计算真实条目

运行Python脚本时,用作命令行参数的SON文本

输出中带有南的亚麻神经网络

如何使用表达式将字符串解压缩到Polars DataFrame中的多个列中?

avxspan与pandas period_range

如何在TensorFlow中分类多个类

Matplotlib中的字体权重

为什么在FastAPI中创建与数据库的连接时需要使用生成器?

如何在FastAPI中替换Pydantic的constr,以便在BaseModel之外使用?'

为罕见情况下的回退None值键入

如何获得满足掩码条件的第一行的索引?

Pandas:将值从一列移动到适当的列

Polars时间戳同步延迟计算

将Pandas DataFrame中的列名的长文本打断/换行为_STRING输出?

对列中的数字进行迭代,得到n次重复开始的第一个行号

如何在微调Whisper模型时更改数据集?