首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Python3中递归删除空文件夹?

如何在Python3中递归删除空文件夹?
EN

Stack Overflow用户
提问于 2014-05-06 15:51:06
回答 3查看 3.3K关注 0票数 6

我正在尝试删除目录的空文件夹。

代码语言:javascript
复制
def remove_empty_dir(path):
    try:
        os.rmdir(path)
    except OSError:
        pass

def remove_empty_dirs(path):
    for root, dirnames, filenames in os.walk(path):
        for dirname in dirnames:
            remove_empty_dir(os.path.realpath(os.path.join(root, dirname)))

remove_empty_dirs(path)

我还尝试过:

代码语言:javascript
复制
import shutil
shutil.rmtree(path)

但这会删除所有内容,即使是那些包含内容的文件夹。问题是我需要这么做

从内到外

,这样,如果我有:

代码语言:javascript
复制
root_folder
  child_folder1
    grandchild_folder1.1 (empty)
  child_folder2
    granchild_folder2.1
    granchild_folder2.2 (empty)

程序应该删除孙子

_

文件夹1.1,子文件夹

_

folder1和子级

_

folder2.2,但不是其余的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-05-06 15:53:39

接受可选

参数(默认值: True)。

通过提供

,你可以先从子目录开始迭代。

代码语言:javascript
复制
def remove_empty_dirs(path):
    for root, dirnames, filenames in os.walk(path, topdown=False):
        for dirname in dirnames:
            remove_empty_dir(os.path.realpath(os.path.join(root, dirname)))
票数 10
EN

Stack Overflow用户

发布于 2021-03-01 14:11:04

使用Python3中的pathlib库,这是一个一行程序(不包括在内)。在target下面的代码片段中

_

path是要清理的树的根的字符串:

代码语言:javascript
复制
from pathlib import Path
import os

[os.removedirs(p) for p in Path(target_path).glob('**/*') if p.is_dir() and len(list(p.iterdir())) == 0]

为了使它不那么密集,并且更容易理解,这是在没有列表理解的情况下编写的相同内容

代码语言:javascript
复制
for p in Path(target_path).glob('**/*'):
    if p.is_dir() and len(list(p.iterdir())) == 0:
        os.removedirs(p)

这里有趣的特性是if语句过滤文件系统树上留下的空目录。os.removedirs()删除空叶上的所有空文件夹。如果一个分支上有多个空叶,删除最后一个空叶将导致os.removedirs()遍历该分支。所以所有的空目录在循环的一次迭代中就消失了,不需要递归!

票数 3
EN

Stack Overflow用户

发布于 2020-05-01 23:46:53

代码语言:javascript
复制
def remove_empty_dirs(dir_path):
    p1 = subprocess.Popen(["find", dir_path, "-type", "d", "-empty", "-print0"], stdout=subprocess.PIPE,)
    p2 = subprocess.Popen(["xargs", "-0", "-r", "rmdir"], stdin=p1.stdout, stdout=subprocess.PIPE)
    p1.stdout.close()
    p2.communicate()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23488924

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档