PathLib递归删除目录?

时间:2018-05-05 07:29:40

标签: python directory pathlib

有没有办法删除PathLib模块中的目录及其内容?对于const SomeComponent = ({ isLogged }) => ( <div> {isLogged <Redirect to="/path" />} <div>something</div> </div> ) ,它只删除文件,path.unlink()目录必须为空。在一个函数调用中没有办法吗?

7 个答案:

答案 0 :(得分:21)

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

答案 1 :(得分:4)

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

答案 2 :(得分:4)

仅使用pathlib,可以清除文件夹内容而无需递归: 只需以相反的顺序删除项目即可。

from pathlib import Path
def rmtree(path):
    path = Path(path) # allow path to be a string
    assert path.is_dir() # make sure it`s a folder
    for p in reversed(list(path.glob('**/*'))): # iterate contents from leaves to root
        if p.is_file():
           p.unlink()
        elif p.is_dir():
            p.rmdir()

# call rmrtree with your folder          
rmtree('path/to/folder')

答案 3 :(得分:2)

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

简单有效:

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