Поиск пустых каталогов в Python

Все,

Каков наилучший способ проверить, есть ли данные в каталоге перед его удалением? Я просматриваю пару страниц, чтобы найти некоторые фотографии с помощью wget, и, конечно, на каждой странице нет изображения, но каталог все еще создается.

dir = 'Files\\%s' % (directory)
os.mkdir(dir)
cmd = 'wget -r -l1 -nd -np -A.jpg,.png,.gif -P %s %s' %(dir,  i[1])
os.system(cmd)
if not os.path.isdir(dir):
    os.rmdir(dir)

Я хотел бы проверить, был ли файл удален в каталог после его создания. Если там ничего нет... удалите его.

Спасибо адам

8 ответов

import os

if not os.listdir(dir):
    os.rmdir(dir)

Стиль LBYL.
для EAFP, см. ответ Муада.

Я пойду с EAFP так:

try:
    os.rmdir(dir)
except OSError as ex:
    if ex.errno == errno.ENOTEMPTY:
        print "directory not empty"

NB: os.rmdir не удаляйте каталог, который не является пустым.

Пытаться:

if not os.listdir(dir): 
    print "Empty"

или же

if os.listdir(dir) == []:
    print "Empty"

Теперь это может быть сделано более эффективно в Python3, поскольку нет необходимости создавать список содержимого каталога, просто чтобы посмотреть, пусто ли оно:

import os

def is_dir_empty(path):
    return next(os.scandir(path), None) is None

Что, если вы проверили, существует ли каталог и есть ли в нем контент... что-то вроде:

if os.path.isdir(dir) and len(os.listdir(dir)) == 0:
    os.rmdir(dir)

Вот самый быстрый и оптимизированный способ проверить, является ли каталог пустым или нет.

empty = False
for dirpath, dirnames, files in os.walk(dir):
    if files:
        print("Not empty !") ;
    if not files:
        print("It is empty !" )
        empty = True
    break ;

Другие ответы, упомянутые здесь, не быстрые, потому что, если вы хотите использовать обычные os.listdir() Если в каталоге слишком много файлов, это замедлит ваш код, и если вы используете os.rmdir( ) метод, чтобы попытаться поймать ошибку, тогда он просто удалит эту папку. Это может быть не то, что вы хотите сделать, если вы просто хотите проверить на пустоту.

Если пустые каталоги уже созданы, вы можете поместить этот скрипт во внешний каталог и запустить его:

import os

def _visit(arg, dirname, names):
    if not names:
        print 'Remove %s' % dirname
        os.rmdir(dirname)

def run(outer_dir):
    os.path.walk(outer_dir, _visit, 0)

if __name__ == '__main__':
    outer_dir = os.path.dirname(__file__)
    run(outer_dir)
    os.system('pause')

У меня есть следующий Bash, проверяющий, есть ли в папке ответ содержимое.

В основном это такой же подход, как ответ @ideasman42 на /questions/5563028/poisk-pustyih-katalogov-v-python/5563050#5563050, чтобы не создавать полный список, который, вероятно, сработаетDebian также.

нет необходимости создавать список содержимого каталога, чтобы просто посмотреть, пуст ли он:


os.walk('.')возвращает полные файлы в каталоге, и если их тысячи, это может быть неэффективным. Вместо следующей командыfind "$target" -mindepth 1 -print -quitвозвращает первый найденный файл и завершает работу. Если он возвращает пустую строку, это означает, что папка пуста.

Вы можете проверить, пуст ли каталог, используя find, и обработка его вывода

def is_dir_empty(absolute_path):
    cmd = ["find", absolute_path, "-mindepth", "1", "-print", "-quit"]
    output = subprocess.check_output(cmd).decode("utf-8").strip()
    return not output

print is_dir_empty("some/path/here")
import os
import tempfile

root = tempfile.gettempdir()
EMPTYDIRS = []

for path, subdirs, files in os.walk(r'' + root ):
    if len( files ) == 0 and len( subdirs ) == 0:
        EMPTYDIRS.append( path )

for e in EMPTYDIRS:
    print e
Другие вопросы по тегам