284

我在删除空目录时遇到问题。这是我的代码:

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

    try:
        os.rmdir(dirpath)
    except OSError as ex:
        print(ex)

参数dir_to_search是我传递需要完成工作的目录的位置。该目录如下所示:

test/20/...
test/22/...
test/25/...
test/26/...

请注意,以上所有文件夹都是空的。当我运行这个脚本时,文件夹2025单独被删除!但是这些文件夹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'

我在哪里犯错?

4

11 回答 11

564

尝试shutil.rmtree

import shutil
shutil.rmtree('/path/to/your/dir/')
于 2012-10-29T08:27:57.667 回答
33

的默认行为os.walk()是从根走到叶。topdown=False开始从叶子os.walk()走到根部。

于 2012-10-29T08:28:13.360 回答
31

这是我的纯pathlib递归目录取消链接器:

from pathlib import Path

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

rmdir(Path("dir/"))
于 2018-04-11T18:26:09.077 回答
14

从 Python 标准库rmtree()中尝试shutil

于 2012-10-29T08:29:41.730 回答
7

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

from shutil import rmtree
rmtree('directory-absolute-path')
于 2016-07-25T09:44:36.483 回答
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)
于 2018-11-04T13:02:32.210 回答
4

该命令(由 Tomek 给出)不能删除 文件,如果它是只读的。因此,可以使用 -

import os, sys
import stat

def del_evenReadonly(action, name, exc):
    os.chmod(name, stat.S_IWRITE)
    os.remove(name)

if  os.path.exists("test/qt_env"):
    shutil.rmtree('test/qt_env',onerror=del_evenReadonly)
于 2016-06-17T09:18:52.877 回答
1

这是一个递归解决方案:

def clear_folder(dir):
    if os.path.exists(dir):
        for the_file in os.listdir(dir):
            file_path = os.path.join(dir, the_file)
            try:
                if os.path.isfile(file_path):
                    os.unlink(file_path)
                else:
                    clear_folder(file_path)
                    os.rmdir(file_path)
            except Exception as e:
                print(e)
于 2019-04-07T22:37:18.730 回答
1

如果您只是在寻找要删除的单个路径,则该命令os.removedirs是该作业的工具,例如:

os.removedirs("a/b/c/empty1/empty2/empty3")

将删除empty1/empty2/empty3,但留下 a/b/c (假设 c 有一些其他内容)。

    removedirs(name)
        removedirs(name)
        
        Super-rmdir; remove a leaf directory and all empty intermediate
        ones.  Works like rmdir except that, if the leaf directory is
        successfully removed, directories corresponding to rightmost path
        segments will be pruned away until either the whole path is
        consumed or an error occurs.  Errors during this latter phase are
        ignored -- they generally mean that a directory was not empty.
于 2021-12-02T19:14:24.887 回答
0

这是另一个纯路径库解决方案,但没有递归:

from pathlib import Path
from typing import Union

def del_empty_dirs(base: Union[Path, str]):
    base = Path(base)
    for p in sorted(base.glob('**/*'), reverse=True):
        if p.is_dir():
            p.chmod(0o666)
            p.rmdir()
        else:
            raise RuntimeError(f'{p.parent} is not empty!')
    base.rmdir()
于 2019-06-14T12:03:06.060 回答
-1

对于Linux用户,您可以简单地以pythonic方式运行shell命令

import os
os.system("rm -r /home/user/folder1  /home/user/folder2  ...")

如果遇到任何问题,请不要rm -r使用rm -rf ,但请记住f将强制删除目录。

whererm代表删除递归和递归+-r强制。-rf

注意:目录是否为空都没有关系,它们将被删除。

于 2020-04-18T22:07:37.887 回答