删除空文件夹 (Python)

Blu*_*ack 6 python directory

这是文件夹树:

FOLDER\\
       \\1\\file
       \\2\\file
       \\3\\
       \\4\\file
Run Code Online (Sandbox Code Playgroud)

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

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

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

此扫描文件夹,并使用folders2DIGITS. 在DIGITS有编号的目录:1,2,3,4等

怎么办?尝试使用,os.rmdir但它给了我一个错误,关于字符串。其实folders2是一个列表,不是一个字符串,只是说...

小智 19

在其他答案的基础上扩展一些内容:

如果您使用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 = False
        for subdir in subdirs:
            if os.path.join(current_dir, subdir) not in deleted:
                still_has_subdirs = True
                break
    
        if not any(files) and not still_has_subdirs:
            os.rmdir(current_dir)
            deleted.add(current_dir)

    return deleted

Run Code Online (Sandbox Code Playgroud)


Tar*_*syk 7

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

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])
Run Code Online (Sandbox Code Playgroud)

  • 是的,此解决方案在某些情况下不起作用,例如:1)递归(如果文件夹深度超过 1 级)2)如果文件夹具有内部文件夹但其中没有文件 (3认同)
  • 对于这个特定案例,这就是我想要的。谢谢。 (2认同)
  • 虽然这回答了问题,但有很多问题!1.根目录为空怎么办?2. 如果一个目录只有所有子目录会怎样?3. 您将生成器转换为列表只是为了跳过您不需要的第一个元素。 (2认同)

Gav*_*hen 7

仅在文件夹为空时删除文件夹:

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
Run Code Online (Sandbox Code Playgroud)

  • 你可以用它来打自己的腿,因为 os.listdir 并不总是正确返回网络共享上的文件(例如,正在重新安装过程中的“挂起”nfs 在卸载时将显示 0),shutil.rmtree在这些情况下可能会让你没有文件...... (3认同)

Ivá*_* B. 7

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

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")
Run Code Online (Sandbox Code Playgroud)

  • `os.remove(path)` 应该是 [`os.rmdir(path)`](https://docs.python.org/3/library/os.html#os.rmdir) (4认同)