Python: 如何列出与文件夹名称列表相匹配的子目录?

Python: how to list subdirectories that match a list of folder names?

我想打印与文件夹列表匹配的子目录列表。

文件夹列表如下所示:

folder_list = ['AL_CLNC_2021',
               'AL_ICF_2021',
               'AL_IMD_2021',
               'AK_IP_2021',
               'AK_NF_2021',]

目录树如下所示: 注意:我不想将“UPLOADED”文件夹包含到我输出的路径列表中。

DirA--
     |
     -- Project
     |
     -- 2021 --
              |
              -- Alabama --
                       |
                       -- AL_CLNC_2021 --
                                     |
                                     -- UPLOADED 
                       -- AL_ICF_2021
                                    |
                                    -- UPLOADED
                       -- AL_IMD_2021
                                    |
                                    -- UPLOADED
              |
              -- Arkansas --
                       |
                       -- AK_IP_2021
                                   |
                                   -- UPLOADED
                       -- AK_NF_2021
                                   |
                                   -- UPLOADED
                      

这是我目前用来创建目录列表的代码:

path = 'path'

#we shall store all the file names in this list
filelist = []

for root, dirs, files in os.walk(path):
    for file in files:
        #append the file name to the list
        filelist.append(os.path.join(root,file))

#print all the file names
for name in filelist:
    print(name)

我希望最终输出看起来像这样,并且只列出初始文件夹列表中的文件夹中包含的目录:

[/Project/2021/Alabama/AL_CLNC_2021,
 /Project/2021/Alabama/AL_ICF_2021,
 /Project/2021/Alabama/AL_IMD_2021,
 /Project/2021/Arkansas/AK_IP_2021,
 /Project/2021/Arkansas/AK_NF_2021,]

执行此操作以获得上述输出的最佳方法是什么?谢谢

只需调整循环以检查找到的条目是否与所需名称之一匹配,而不必费心检查文件(因为您要查找的是目录):

for root, dirs, files in os.walk(path):
    for d in dirs:            # Loop over directories, not files
        if d in folder_list:  # Only keep ones that match
            filelist.append(os.path.join(root, d))

对于足够大的 folder_lists,将 folder_listlist 转换为 set/frozenset 可能是有意义的,因此查找更便宜(要么最初用 {} 定界符而不是 [] 定义它,要么在它被填充之后,但在循环开始之前做 folder_list = frozenset(folder_list) ),但现在,这个开销应该可以忽略不计文件系统访问成本。

您还可以通过在下一个循环开始之前过滤 dirs 来阻止通过匹配目录进一步嵌套遍历(假设您永远不会在另一个目录中找到匹配目录,并且可以通过不深入查找来节省工作),只需添加:

dirs[:] = [d for d in dirs if d not in folder_list]

在内部循环之后(外部)(因此它在您循环回到 os.walk 的下一次迭代之前运行); os.walk 查找对 dirs 的任何就地更改,并在通过文件系统进一步下降时使用新版本,因此它根本不会尝试遍历排除的目录。

您正在查看文件,而不是文件夹。在您的代码中,您使用“文件”作为变量名,这只会让人感到困惑。在 for 循环的每次迭代中,dirs 保存找到的子文件夹列表。你想要这个列表和你要找的文件夹的交集,所以把它变成集合操作就可以了。

import os

wanted_folders = set(['AL_CLNC_2021',
               'AL_ICF_2021',
               'AL_IMD_2021',
               'AK_IP_2021',
               'AK_NF_2021',])

path = 'path'

#we shall store all the folder names in this list
folder_list = []

for root, dirs, _ in os.walk(path):
    for folder in wanted_folders.intersection(dirs):
        folder_list.append(os.path.join(root,folder))

#print all the file names
for name in folder_list:
    print(name)