繁体   English   中英

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

[英]How to delete recursively empty folders in Python3?

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

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)

我也试过:

import shutil
shutil.rmtree(path)

但这会删除所有内容,甚至是那些包含内容的文件夹。 问题是我需要从内到外这样做,如果我有:

root_folder
  child_folder1
    grandchild_folder1.1 (empty)
  child_folder2
    granchild_folder2.1
    granchild_folder2.2 (empty)

程序应该删除grandchild_folder1.1、child_folder1 和child_folder2.2,但不删除其余部分。

os.walk接受可选的topdown参数(默认值:True)。

通过提供topdown=False ,您可以首先从子目录进行迭代。

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

使用 Python 3 中的 pathlib 库,这是一个单行(包含除外)。 在 target_path 下面的代码段中,是您要清理的树根的字符串:

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]

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

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() 向上走分支。 所以所有空目录都在循环的一次迭代中消失了,不需要递归!

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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM