是否递归删除目录?

有没有办法删除 PathLib 模块中的目录及其内容?对于 path.unlink(),它只删除一个文件,对于 path.rmdir(),目录必须是空的。没有办法在一个函数调用中完成吗?

62631 次浏览

正如您已经知道的,只有两种用于删除文件/目录的 Path方法是 .unlink().rmdir(),它们都不是您想要的方法。

Pathlib 是一个跨不同操作系统提供面向对象路径的模块,它并不意味着有很多不同的方法。

这个库的目的是提供一个简单的类层次结构,以 处理文件系统路径以及用户对它们进行的常见操作。

“不常见”的文件系统更改(例如递归删除目录)存储在不同的模块中。如果要递归地删除目录,应该使用 shutil模块。(它也可以用于 Path实例!)

import shutil
import pathlib
import os  # for checking results


print(os.listdir())
# ["a_directory", "foo.py", ...]


path = pathlib.Path("a_directory")


shutil.rmtree(path)
print(os.listdir())
# ["foo.py", ...]

如果您不介意使用第三方库,请尝试使用 路径。 它的 API 类似于 pathlib.Path,但提供了一些其他方法,包括 Path.rmtree()递归删除目录树。

否则,如果你只想要 pathlib,你可以试试这个:

from pathlib import Path




def rm_tree(pth: Path):
for child in pth.iterdir():
if child.is_file():
child.unlink()
else:
rm_tree(child)
pth.rmdir()


rm_tree(your_path)

下面是 纯粹的 Pathlib的实现:

from pathlib import Path




def rm_tree(pth):
pth = Path(pth)
for child in pth.glob('*'):
if child.is_file():
child.unlink()
else:
rm_tree(child)
pth.rmdir()
def rm_rf(basedir):
if isinstance(basedir,str): basedir = pathlib.Path(basedir)
if not basedir.is_dir(): return
for p in reversed(list(basedir.rglob("*"))):
if p.is_file(): p.unlink()
elif p.is_dir(): p.rmdir()
basedir.rmdir()

您可以使用 pathlib3x-它提供了最新版本的后端(在编写本答案之日,Python 3.10)。A0)用于 Python 3.6或更新版本的 Python pathlib,以及一些额外的函数,如 rmtree

>>> python -m pip install pathlib3x


>>> import pathlib3x as pathlib


>>> my_path = pathlib.Path('c:/tmp/some_directory')
>>> my_path.rmtree(ignore_errors=True)




你可以在 Github派派上找到它


免责声明: 我是 pathlib3x 库的作者。

简单有效:

def rmtree(f: Path):
if f.is_file():
f.unlink()
else:
for child in f.iterdir():
rmtree(child)
f.rmdir()