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

时间:2012-10-29 08:20:09

标签: python directory

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

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'

我在哪里犯了错误?

11 个答案:

答案 0 :(得分:302)

尝试shutil.rmtree

import shutil
shutil.rmtree('/path/to/your/dir/')

答案 1 :(得分:25)

os.walk()的默认行为是从root到leaf。在topdown=False中设置os.walk()以从一个树到另一个步行。

答案 2 :(得分:12)

shutil中尝试rmtree。在python std库中

答案 3 :(得分:7)

节目有点晚了,但这是我的纯Pathlib递归目录解链接

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/"))

答案 4 :(得分:6)

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

from shutil import rmtree
rmtree('directory-absolute-path')

答案 5 :(得分:3)

对于下一个正在寻找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)

答案 6 :(得分:2)

命令(由Tomek提供)无法删除文件,如果它是只读。因此,人们可以使用 -

import os, sys
from stat import *

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)

答案 7 :(得分:0)

这是一个递归解决方案:

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)

答案 8 :(得分: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()

答案 9 :(得分:0)

path = "C:\\Personal"
ls = [x[0] for x in os.walk(path)][::-1]
for i in ls:
    if os.path.isdir(i):
        if not os.listdir(i):
            os.rmdir(i)

答案 10 :(得分:0)

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

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

其中rm表示删除-r表示递归