繁体   English   中英

PathLib 递归删除目录?

[英]PathLib recursively remove directory?

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

正如您已经知道的那样,删除文件/目录的唯一两种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", ...]

这是一个纯 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()

否则,如果你只想要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)
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()

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

您可能会使用 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 库的作者。

简单有效:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM