删除空文件夹(Python)

问题描述 投票:0回答:13

这是文件夹树:

FOLDER\\
       \\1\\file
       \\2\\file
       \\3\\
       \\4\\file

脚本应扫描(循环)FOLDER 中的每个文件夹并检查子文件夹是否为空。如果是,则必须将其删除。

到目前为止,我的代码是这样的:

folders = ([x[0] for x in os.walk(os.path.expanduser('~\\Desktop\\FOLDER\\DIGITS\\'))])
folders2= (folders[1:])

此扫描文件夹,并使用

folders2
DIGITS
中的第一个文件夹开始。 在
DIGITS
中有编号的目录:1,2,3,4,etc

现在怎么办?尝试使用

os.rmdir
但它给了我一个错误,一些关于字符串的错误。事实上,
folders2
是一个列表,而不是一个字符串,只是说...

python directory
13个回答
17
投票

不确定你会遇到什么样的错误,这对我来说非常有效:

import os

root = 'FOLDER'
folders = list(os.walk(root))[1:]

for folder in folders:
    # folder example: ('FOLDER/3', [], ['file'])
    if not folder[2]:
        os.rmdir(folder[0])

15
投票

您可以使用以下代码片段删除所有空文件夹和子文件夹。

import os


def remove_empty_folders(path_abs):
    walk = list(os.walk(path_abs))
    for path, _, _ in walk[::-1]:
        if len(os.listdir(path)) == 0:
            os.remove(path)

if __name__ == '__main__':
    remove_empty_folders("your-path")

15
投票

对其他答案进行扩展的一些内容:

如果您使用

os.walk(topdown=False)
,则会以相反的顺序进行,因此您会在父目录之前遇到子目录。然后,如果您跟踪已删除的目录,则可以递归删除父目录。

import os


def delete_empty_folders(root):

    deleted = set()
    
    for current_dir, subdirs, files in os.walk(root, topdown=False):

        still_has_subdirs = any(
            _ for subdir in subdirs
            if os.path.join(current_dir, subdir) not in deleted
        )
    
        if not any(files) and not still_has_subdirs:
            os.rmdir(current_dir)
            deleted.add(current_dir)

    return deleted


6
投票

仅删除空文件夹:

import os
import shutil

if len(os.listdir(folder_path)) == 0: # Check if the folder is empty
    shutil.rmtree(folder_path) # If so, delete it

3
投票
import os

directory = r'path-to-directory'

for entry in os.scandir(directory):
    if os.path.isdir(entry.path) and not os.listdir(entry.path) :
        os.rmdir(entry.path)

在这里您可以找到 scandir

的很好的介绍/解释

3
投票

几乎是 Iván B. 所说的,但做了一些对我有用的小改动

import os, shutil
path_abs=('YourPath')
walk = list(os.walk(path_abs))
for path, _, _ in walk[::-1]:
    if len(os.listdir(path)) == 0:
        os.rmdir(path)

2
投票
#LOOP THROUGH ALL SUBFOLDERS FIRST

import os
root = os.getcwd() #CHANGE THIS TO PATH IF REQUIRED
folders = sorted(list(os.walk(root))[1:],reverse=True)
for folder in folders:
    try:
        os.rmdir(folder[0])
    except OSError as error: 
        print("Directory '{}' can not be removed".format(folder[0])) 

这应该首先遍历所有子文件夹,然后删除空文件夹。不删除父文件夹的非空文件夹。

我知道这是一篇旧帖子,但我自己也老了!!!


1
投票

对于空文件夹删除,您可以使用此代码片段。

import os


def drop_empty_folders(directory):
    """Verify that every empty folder removed in local storage."""

    for dirpath, dirnames, filenames in os.walk(directory, topdown=False):
        if not dirnames and not filenames:
            os.rmdir(dirpath)

1
投票

此答案解决了当前接受的答案中的问题。主要问题是删除目录的条件必须是

not filenames and not dirnames

import os

def remove_empty_directories(root):
    for dirpath, dirnames, filenames in os.walk(root):
        if not filenames and not dirnames:
            os.rmdir(dirpath)

1
投票

如果您使用的是 UNIX 系统,您可以在带有子进程的 python 脚本中使用“find”命令。
您可以使用以下命令搜索目录:-type d
您可以使用以下命令选择空目录:-empty
您可以使用以下命令删除这些目录:-delete
您可以使用 subprocess.run 启动命令

import subprocess

command = "find {} -type d -empty -delete".format(folder_path)  
subprocess.run(command, shell=True)

只有3行代码。

按照@tripleee的建议,代码可以这样写:

import subprocess
path = "your path here"
command = ["find", path, "-type", "d", "-empty", "-delete"]
subprocess.run(command)

0
投票

我建议你调用这个函数,它设计有一个可选参数。 如果您将

in_place
设置为
False
,它不会删除文件夹,只会将它们作为列表返回。同时,如果您将其设置为
True
,无论子目录树深度如何,该功能都会删除空文件夹。

P.S. 如果您需要深度限制,您可以通过根路径之后的元素进行分析。

import os
import shutil

def purge_dir(dir, in_place=False):

    deleted = []
    dir_tree = list(os.walk(dir, topdown=False))

    for tree_element in dir_tree:
        sub_dir = tree_element[0]
        is_empty = not len(os.listdir(sub_dir))
        if is_empty:
            deleted.append(sub_dir)

    if in_place:
        list(map(os.rmdir, deleted))

    return deleted

我建议

in_place
设置为
False
返回空文件夹并根据需要使用它,因为它更安全,特别是对于安全关键应用程序。


0
投票

这个问题解决了所有其他答案的问题。它可以避免给您一个

PermissionDenied
错误,从而阻止程序删除文件夹。

import os
import shutil

def remove_empty_folders(path_abs):
    walk = list(os.walk(path_abs))
    for path, _, _ in walk[::-1]:
        if len(os.listdir(path)) == 0:
            shutil.rmtree(path)

0
投票

这是 @rcgale 答案的另一个版本。它用一组比较替换了any()循环来检查子目录。

    def remove_empty_dirs(root_path):
        deleted_dirs = set()
        for current_dir, subdirs, files in os.walk(root_path, topdown=False):
            still_has_subdirs = set(subdirs).intersection(deleted_dirs) != set(subdirs)
            if not files and not still_has_subdirs:
                os.rmdir(current_dir)
                deleted_dirs.add(current_dir)
    
        return deleted_dirs
© www.soinside.com 2019 - 2024. All rights reserved.