我有一个这样的文件夹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')
不起作用。
所有文件夹都具有相同的子文件夹(名称),但是其中一些是空的。我需要找到所有这些文件夹中的空白并进行打印。
答案 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
当然,有些东西可以在代码中进行优化。