代码之家  ›  专栏  ›  技术社区  ›  Jasonca1

PathLib递归删除目录?

  •  101
  • Jasonca1  · 技术社区  · 6 年前

    是否有任何方法可以删除PathLib模块中的目录及其内容?具有 path.unlink() 它只删除一个文件,带有 path.rmdir() 目录必须为空。是否没有办法在一个函数调用中完成?

    7 回复  |  直到 6 年前
        1
  •  120
  •   DV82XL    3 年前

    正如你所知,只有两个 Path 删除文件/目录的方法有 .unlink() .rmdir() 你想要的也不是。

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

    该库的目的是为 处理文件系统路径和用户对其执行的常见操作。

    “不常见”的文件系统更改(如递归删除目录)存储在不同的模块中。如果要递归删除目录,应使用 shutil 单元(它与 路径 实例也是!)

    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", ...]
    
        2
  •  24
  •   MatteoLacki    5 年前

    这里有一个 纯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()
    
        3
  •  13
  •   Rami    5 年前

    否则,如果你愿意,你可以试试这个 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)
    
        4
  •  5
  •   AXO    4 年前

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

        5
  •  5
  •   evandrix    3 年前
    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()
    
        6
  •  4
  •   bitranox    4 年前

    您可以使用pathlib3x,它提供了用于Python 3.6或更高版本的最新Python pathlib(在编写本答案Python 3.10.a0之日)的后端口,以及一些附加函数,如 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 PyPi


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

        7
  •  3
  •   maf88    3 年前

    简单有效:

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