Поиск пустых каталогов в Python - PullRequest
39 голосов
/ 02 июня 2011

All

Как лучше всего проверить, есть ли данные в каталоге перед его удалением? Я просматриваю пару страниц, чтобы найти фотографии с помощью 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 ]

55 голосов
/ 02 июня 2011
import os

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

LBYL style.
EAFP , см. ответ Муада.

44 голосов
/ 02 июня 2011

Я пойду с EAFP примерно так:

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

os.rmdir не удалит не пустой каталог.

18 голосов
/ 02 июня 2011

Попробуйте:

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

или

if os.listdir(dir) == []:
    print "Empty"
5 голосов
/ 18 ноября 2017

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

import os

def is_dir_empty(path):
    return next(os.scandir(path), None) is None
2 голосов
/ 02 июня 2011

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

if os.path.isdir(dir) and len(os.listdir(dir)) == 0:
    os.rmdir(dir)
1 голос
/ 20 мая 2016

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

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')
0 голосов
/ 14 мая 2018

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

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( ), чтобы попытаться отловить ошибку, тогда она просто удалит эту папку. Это может быть не то, что вы хотите сделать, если вы просто хотите проверить на пустоту.

0 голосов
/ 30 мая 2017
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
...