删除空目录列表的安全方法是什么?

时间:2019-07-18 13:38:08

标签: python python-3.x

我使用Path.iterdir()浏览目录列表并执行一些工作。

from pathlib import Path

for folder in repository.iterdir():
    # do some work

完成该任务后,如果成功完成,目录应该为空。我知道您不应该modify a list you're iterating over,所以我认为这样做是不好的做法,对吗?

for folder in repository.iterdir():
    folder.rmdir()

相反,我所做的是收集一个空目录列表,然后使用该列表删除目录,如下所示:

# Get a list of all the directories that are empty.
directories_to_remove = [folder for folder in repository.iterdir() if not os.listdir(folder)]

# Remove all the directories that are empty
for folder in directories_to_remove:
    folder.rmdir()

directories_to_remove中的文件夹路径仍然存在,因此我没有修改要遍历的列表,这是从驱动器中删除目录的正确方法吗?

3 个答案:

答案 0 :(得分:0)

这是删除实际目录的正确方法,但是您没有从directories_to_remove

删除它,这是正确的。

如果愿意,您可以更改:

for folder in directories_to_remove:
    folder.rmdir()

to

for folder in directories_to_remove:
    folder.rmdir()
    directories_to_remove.remove(folder)

但是,如果您不打算在迭代过程中将其从列表中删除,那么您就成功了,不错:)

答案 1 :(得分:0)

iterdir doesn't remove a list,所以你很好。而且,如果它确实返回了一个列表,则您的代码不会删除其中的任何项目,因此,只要确实删除了目录,反正还是可以的。

答案 2 :(得分:0)

iterator确定在Python中遍历数据时会发生什么,而更改iterable所指的iterator时可能会出现问题。如果您要遍历一次创建的列表,则可以处理从中创建的数据,而不会造成任何损害。但是由于iterdir是“屈服”值,因此它似乎是generator,因此它会即时获取数据,是否发生不良情况取决于其实现方式(和/或基础系统调用)。

除非您遇到严重的性能或内存问题,否则我不会在处理数据之前先抓住机会提取所有数据

for folder in [repository.iterdir()]:
    folder.rmdir()

请注意,这也不是100%安全的,因为在命中folder.rmdir()之前可能会填充,更改或删除目录,但是除非您使用多重处理,否则这极不可能。