简体   繁体   中英

Python: Remove empty folders recursively

I'm having troubles finding and deleting empty folders with my Python script. I have some directories with files more or less like this:

A/
--B/
----a.txt
----b.pdf
--C/
----d.pdf

I'm trying to delete all files which aren't PDFs and after that delete all empty folders. I can delete the files that I want to, but then I can't get the empty directories. What I'm doing wrong?

    os.chdir(path+"/"+name+"/Test Data/Checklists")
    pprint("Current path: "+ os.getcwd())
    for root, dirs, files in os.walk(path+"/"+name+"/Test Data/Checklists"):
            for name in files:
                    if not(name.endswith(".pdf")):
                            os.remove(os.path.join(root, name))
    pprint("Deletting empty folders..")
    pprint("Current path: "+ os.getcwd())
    for root, dirs, files in os.walk(path+"/"+name+"/Test Data/Checklists", topdown=False):
            if not dirs and not files:
                    os.rmdir(root)

use insted the function

os.removedirs(path)

this will remove directories until the parent directory is not empty.

Ideally, you should remove the directories immediately after deleting the files, rather than doing two passes with os.walk

import sys
import os

for dir, subdirs, files in os.walk(sys.argv[1], topdown=False):
    for name in files:
        if not(name.endswith(".pdf")):
            os.remove(os.path.join(dir, name))

    # check whether the directory is now empty after deletions, and if so, remove it
    if len(os.listdir(dir)) == 0:
        os.rmdir(dir)

For empty folders deletion you can use this snippet. It can be combined with some files deletion, but as last run should be used as is.

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)

remove all empty folders

import os 
folders = './A/'  # directory
for folder in list(os.walk(folders)) :
    if not os.listdir(folder[0]):
        os.removedirs(folder[0])



The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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