我正在尝试删除目录的空文件夹。
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,但不能删除其余部分。
答案 0 :(得分:5)
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)))
答案 1 :(得分:0)
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()
答案 2 :(得分:0)
使用 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() 向上走分支。因此,所有空目录都在循环的单次迭代中消失,无需递归!