我使用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
中的文件夹路径仍然存在,因此我没有修改要遍历的列表,这是从驱动器中删除目录的正确方法吗?
答案 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()
之前可能会填充,更改或删除目录,但是除非您使用多重处理,否则这极不可能。