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_list
s,将 folder_list
从 list
转换为 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)
我想打印与文件夹列表匹配的子目录列表。
文件夹列表如下所示:
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_list
s,将 folder_list
从 list
转换为 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)