打印包含相同子文件夹的所有文件夹中哪个子文件夹为空?

Print what subfolder is empty in all folders that contain the same subfolder?

我有一个这样的文件夹A:

A>>(B,C,D)(subfolders)>>both B,C and D have folders 1,2,3 each.

在这种情况下,B、C 和 D 中的子文件夹“3”恰好是空的。

如何查看打印所有文件夹中哪个文件夹恰好为空 例如让它搜索并打印数字“3”,因为它是所有文件夹 B、C 和 D 中唯一为空的子文件夹?

我试过的代码:

for i in glob.iglob('**/Desktop/A/**' ,recursive = True):
    if not os.listdir(i):
        print(f'{i} is empty everywhere' + '\n')

这是行不通的。

所有文件夹都有相同的子文件夹(名称),但其中一些是空的。我需要在所有这些文件夹中找到哪些是空的并打印出来。

目前能想到的最简单的解决方案是使用映射,其中键是文件夹名称,值可以是布尔值。 True 如果到处都是空的,False 否则。默认值为 True。所以我会使用:

all_empty_map = {}
for i in glob.iglob('**/Desktop/A**', recursive=True):
    cur_dir = os.path.basename(i)
    all_empty_map[cur_dir] = all_empty_map.get(cur_dir, True) and not os.listdir(i)

for cur_dir, isempty in all_empty_map.items():
    if isempty:
        print cur_dir

当然,代码中可能还有可以优化的地方

我们需要 os 模块中的两个函数

from os import walk
from os.path import join

我们需要一个起点

dir = '/your/top/directory'

walk returns 一个生成器,在每一步迭代它我们有当前目录的路径,目录列表和文件列表但是我们不想迭代并且对当前目录中的目录列表感兴趣,因此

dirs_l1 = next(walk(dir))[1]

请注意,必须处理发电机,以上内容并不太浪费...

现在我们在第 1 级子目录(l1 sd,包含在根目录中的 sd)上有一个内部循环来创建第 2 级目录集的列表,将被解压并传递给 set.intersection,因此在 dirs_l2 中,我们最终得到了第 1 级

每个 目录中存在的第 2 级所有目录的集合
dirs_l2 = set.intersection(*[set(next(walk(join(dir, d)))[1]) for d in dirs_l1])

我们在这些内部目录上循环,出现在每个 l1 sd 中,并使用 all 内置我们检查,对于每个 l1 sd,所有 l2 sd 都是空的,在这种情况下,我们打印始终为空的 l2 子目录的名称

for d2 in dirs_l2:
    if all(next(walk(join(dir, d1, d2)))[1:] == ([],[]) for d1 in dirs_l1):
        print(d2)

一个例子

$ cat A.py
from os import walk
from os.path import join
dir = './A'
dirs_l1 = next(walk(dir))[1]
dirs_l2 = set.intersection(*[set(next(walk(join(dir, d)))[1]) for d in dirs_l1])
for d2 in dirs_l2:
    if all(next(walk(join(dir, d1, d2)))[1:] == ([], []) for d1 in dirs_l1): print(d2)
$ tree A
A
├── A
│   ├── 1
│   │   └── a
│   ├── 2
│   │   └── b
│   └── 3
├── B
│   ├── 1
│   │   └── a
│   ├── 2
│   │   └── b
│   └── 3
├── C
│   ├── 1
│   │   └── a
│   ├── 2
│   │   └── b
│   └── 3
└── D
    ├── 1
    │   └── a
    ├── 2
    │   └── b
    └── 3
$ python A.py 
3
$