以递归方式删除python中的文件夹

sri*_*ram 172 python directory

我在删除空目录时遇到问题.我有这样的代码:

for dirpath, dirnames, filenames in os.walk(dir_to_search):
    //other codes

    try:
        os.rmdir(dirpath)
    except OSError as ex:
        print(ex)
Run Code Online (Sandbox Code Playgroud)

这个论点dir_to_search是我传递工作需要关闭的目录.该目录如下所示:

test/20/...
test/22/...
test/25/...
test/26/...
Run Code Online (Sandbox Code Playgroud)

请注意,以上所有文件夹都是空的.当我运行该脚本的文件夹20,25单独被删除!但文件夹2526没有删除,即使它们是空文件夹.

编辑:

我得到的例外是:

[Errno 39] Directory not empty: '/home/python-user/shell-scripts/s3logs/test'
[Errno 39] Directory not empty: '/home/python-user/shell-scripts/s3logs/test/2012'
[Errno 39] Directory not empty: '/home/python-user/shell-scripts/s3logs/test/2012/10'
[Errno 39] Directory not empty: '/home/python-user/shell-scripts/s3logs/test/2012/10/29'
[Errno 39] Directory not empty: '/home/python-user/shell-scripts/s3logs/test/2012/10/29/tmp'
[Errno 39] Directory not empty: '/home/python-user/shell-scripts/s3logs/test/2012/10/28'
[Errno 39] Directory not empty: '/home/python-user/shell-scripts/s3logs/test/2012/10/28/tmp'
[Errno 39] Directory not empty: '/home/python-user/shell-scripts/s3logs/test/2012/10/26'
[Errno 39] Directory not empty: '/home/python-user/shell-scripts/s3logs/test/2012/10/25'
[Errno 39] Directory not empty: '/home/python-user/shell-scripts/s3logs/test/2012/10/27'
[Errno 39] Directory not empty: '/home/python-user/shell-scripts/s3logs/test/2012/10/27/tmp'
Run Code Online (Sandbox Code Playgroud)

我犯了错误的地方.

提前致谢.

小智 345

试试shutil.rmtree:

import shutil
shutil.rmtree('/path/to/your/dir/')
Run Code Online (Sandbox Code Playgroud)

  • 小心,因为rmtree也会删除文件.如上所述,问题是如何删除EMPTY目录.os.walk的文档给出了一个几乎完全匹配这个问题的例子:`import os for root,dirs,os.walk中的文件(top,topdown = False):for dirs中的名称:os.rmdir(os.path.join(root,name))` (6认同)
  • `rmtree`是否删除了整个目录?我猜它类似于`rm -Rf $ DIR` (5认同)

lqs*_*lqs 27

默认行为os.walk()是从根走到叶.设置topdown=Falseos.walk()从叶步行到根.

  • `shutil.rmtree(path)` 有什么问题? (8认同)

mic*_*oo8 12

shutil中尝试rmtree .在python std库中

  • 来自docs:"删除整个目录树;路径必须指向目录(但不是指向目录的符号链接).如果ignore_errors为true,则将忽略由删除失败导致的错误;如果为false或省略,则会处理此类错误通过调用onerror指定的处理程序,或者,如果省略,则会引发异常." (2认同)

mit*_*tch 12

显示有点晚了但这里是我的纯Pathlib递归目录unlinker

def rmdir(dir):
    dir = Path(dir)
    for item in dir.iterdir():
        if item.is_dir():
            rmdir(item)
        else:
            item.unlink()
    dir.rmdir()

rmdir(pathlib.Path("dir/"))
Run Code Online (Sandbox Code Playgroud)

  • `shutil.rmtree(path)` 有什么问题? (5认同)
  • 非常好,并且是一个实际的递归示例作为奖励。 (2认同)

Gaj*_*der 7

最好使用绝对路径并仅导入rmtree函数, from shutil import rmtree 因为这是一个大包,上面的行只会导入所需的函数.

from shutil import rmtree
rmtree('directory-absolute-path')
Run Code Online (Sandbox Code Playgroud)


小智 5

只是为了下一个寻找 micropython 解决方案的人,这完全基于 os(listdir、remove、rmdir)。它既不完整(尤其是在错误处理方面)也不花哨,但它在大多数情况下都可以工作。

def deltree(target):
    print("deltree", target)
    for d in os.listdir(target):
        try:
            deltree(target + '/' + d)
        except OSError:
            os.remove(target + '/' + d)

    os.rmdir(target)
Run Code Online (Sandbox Code Playgroud)