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

用户名

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

这是行不通的。

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

博菲

我们需要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我们最终有了一个集合级别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
$ 

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章