95

有什么方法可以删除 PathLib 模块中的目录及其内容?path.unlink()它只删除一个文件,目录path.rmdir()必须为空。有没有办法在一个函数调用中做到这一点?

4

7 回答 7

116

如您所知,删除文件/目录的唯一两种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", ...]
于 2018-05-05T08:01:43.993 回答
22

这是一个纯粹的 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()
于 2019-10-01T11:25:27.737 回答
10

否则,如果你只想试试这个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)
于 2019-09-11T15:14:33.403 回答
5

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

于 2019-02-01T12:19:10.107 回答
5
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()
于 2020-03-26T14:40:26.970 回答
3

您可以使用 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)


你可以在githubPyPi上找到它


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

于 2020-07-05T15:16:04.293 回答
3

简单有效:

def rmtree(f: Path):
    if f.is_file():
        f.unlink()
    else:
        for child in f.iterdir():
            rmtree(child)
        f.rmdir()
于 2021-03-09T17:40:25.847 回答