Поиск пустых каталогов в 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 ответов
Пытаться:
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