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

2024-09-28 23:32:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样一个文件夹:

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')

这是行不通的。你知道吗

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


Tags: and代码in文件夹forhave数字glob
2条回答

现在可以想到的最简单的解决方案是使用映射,其中键是文件夹名称,值可以是布尔值。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返回一个生成器,在每一步对它进行迭代我们有当前目录的路径、目录列表和文件列表,但我们不想迭代,只对当前目录中的目录列表感兴趣,因此

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

注意,必须处理一个发电机,以上不是太浪费。。。你知道吗

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

dirs_l2 = set.intersection(*[set(next(walk(join(dir, d)))[1]) for d in dirs_l1])

我们在每个l1sd中存在的这些内部目录上做一个循环,并使用all内置项检查,对于每个l1sd,所有l2sd都是空的,在这种情况下,我们打印总是空的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
$ 

相关问题 更多 >