使用Python删除大量文件

7

我正在尝试删除一个目录中的所有文件。《Python中删除文件夹内容》(Delete Folder Contents in Python) 的最佳答案建议获取所有文件的列表并在循环中调用“unlink”。

假设我在网络共享中有数千个文件,并希望将目录绑定时间尽可能短。

使用类似rm -f /path/*这样的shell命令,还是使用shutils.rmtree等工具更有效率?


3
如果你将目录改名为一个新的名称(比如deleteme),然后创建一个新目录,那么你可以在方便的时候后台删除旧目录。 - nmichaels
有趣的想法 @nmichaels。那么把它简单移动到 /dev/null 中怎么样? - Dave
这不会比删除更快;在相同的文件系统上使用os.rename移动是超级快的。 - agf
@Dave:有趣的想法,但是mv: cannot overwrite non-directory /dev/null' with directory deleteme/' - nmichaels
如果您可以使用Python 3.5,则使用os.scandir()代替os.listdir()可以显著提高速度。 - Michael Scott Asato Cuthbert
2个回答

10
如果你真的想删除整个目录树,使用 shutils.rmtree 比使用 os.remove(相当于 os.unlink)更快。它还允许你指定一个回调函数来处理错误。
在@nmichaels的评论中提供的建议也不错,你可以用os.rename重命名目录,然后在原位置创建一个新的目录,并对原始重命名目录使用shutils.rmtree

这个问题是关于比较Python(我认为rmtree是最好的)和Unix Shell(rm -Rf <tree>)的。 - orzel
@orzel 他说的是那样,但我认为他真正想表达的是如何快速完成,而 rmtree 可以做到。他接受了我的答案,所以我们必须假设我满足了他的意图。 - agf
1
可能吧。我对原始问题很感兴趣:Python/rmtree和分叉'rm -Rf'哪个更快?我正在寻找关于此的测试/数据和论据。 - orzel

0

我尝试了这个解决方案,看起来效果不错:

while os.path.exists(file_to_delete):
  os.remove(file_to_delete)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接