PathLib递归删除目录?

Jas*_*ca1 18 python directory pathlib

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

abc*_*ccd 35

正如您所知,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", ...]
Run Code Online (Sandbox Code Playgroud)

  • 仅当目录为空时`path.rmdir()`才会删除目录 (7认同)
  • @SebastianWerk 公关!公关!公关!——虽然在标准图书馆中,但遗憾的是它暂时不会出来,并且需要付出很大的努力才能进入。我同意你的看法 (4认同)
  • 只是提一下,可以这样-https://stackoverflow.com/a/49782093/4249707 (3认同)
  • 我仍然不明白,为什么递归版本不是pathlib.Path的一部分,当所有一切都已经存在时。我真的很希望,这种对os.path,os.mkdir,shutil等令人困惑的用法以pathlib结尾。 (3认同)

小智 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()
Run Code Online (Sandbox Code Playgroud)

  • 我想这会删除符号链接目录的内容? (5认同)
  • `shutil.rmtree` 的不安全版本做了类似的事情([来源](https://github.com/python/cpython/blob/0ac5372bf6b937ed44a8f9c4e402d024fcd80870/Lib/shutil.py#L595)),但它引发了一个 `OSError(如果是符号链接目录,则“无法在符号链接上调用 rmtree”)`。 (2认同)

Ram*_*ami 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)
Run Code Online (Sandbox Code Playgroud)


maf*_*f88 8

简单有效:

def rmtree(f: Path):
    if f.is_file():
        f.unlink()
    else:
        for child in f.iterdir():
            rmtree(child)
        f.rmdir()
Run Code Online (Sandbox Code Playgroud)


bit*_*nox 7

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


Run Code Online (Sandbox Code Playgroud)

你可以在githubPyPi上找到它


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


AXO*_*AXO 5

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


zal*_*ari 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()
Run Code Online (Sandbox Code Playgroud)