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

时间:2018-08-01 14:13:35

标签: python glob

我有一个这样的文件夹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')

不起作用。

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

2 个答案:

答案 0 :(得分:1)

我们需要os模块中的两个功能

from os import walk
from os.path import join

我们需要一个起点

dir = '/your/top/directory'

walk返回一个生成器,在每个步骤上对其进行迭代,我们拥有当前目录的路径,目录列表和我们不想迭代且感兴趣的文件列表,但我们对此不感兴趣。在当前目录的目录列表中,因此

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

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

现在,我们在级别1的子目录(l1 sd,根目录中包含的sd)上有一个内部循环,以创建级别2的目录集的列表,将其解压缩并传递给set.intersection,因此,在dirs_l2中,我们最终拥有一组所有2级目录,这些目录都存在于1级每个目录中

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
$ 

答案 1 :(得分:0)

现在可以想到的最简单的解决方案是使用地图,其中的键是文件夹名称,值可以是布尔值。 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

当然,有些东西可以在代码中进行优化。