Ответ 1
'files' уже сообщает вам, что находится в каталоге. Просто проверьте:
for dirpath, dirnames, files in os.walk('.'):
if files:
print(dirpath, 'has files')
if not files:
print(dirpath, 'is empty')
Я искал всюду для ответа, но не могу найти его.
Я пытаюсь найти script, который будет искать определенную подпапку, а затем проверить, содержит ли она какие-либо файлы и если да, напишите путь к папке. Я понял, что часть поиска вложенных папок вычислена, но проверка файлов превзошла меня.
Я нашел несколько советов о том, как проверить, что папка пуста, и я попытался изменить сценарии, чтобы проверить, не является ли папка пустой, но я не получаю правильных результатов.
Вот ближайший script:
for dirpath, dirnames, files in os.walk('.'):
if os.listdir(dirpath)==[]:
print(dirpath)
Здесь перечислены все пустые вложенные папки, но если я попытаюсь изменить их на:
if os.listdir(dirpath)!=[]:
print(dirpath)
он перечислит все - не только вложенные папки, содержащие файлы.
Я был бы очень признателен, если бы кто-то мог указать мне в правильном направлении.
Это для Python 3.4, если это имеет значение.
Спасибо за любую помощь, которую вы можете мне дать.
'files' уже сообщает вам, что находится в каталоге. Просто проверьте:
for dirpath, dirnames, files in os.walk('.'):
if files:
print(dirpath, 'has files')
if not files:
print(dirpath, 'is empty')
Вы можете использовать новую библиотеку pathlib
, представленную в Python 3.4, для рекурсивного извлечения всех непустых подкаталогов, например:
import pathlib
root = pathlib.Path('some/path/here')
non_empty_dirs = {str(p.parent) for p in root.rglob('*') if p.is_file()}
Поскольку вам все равно нужно ходить по дереву, мы создаем набор родительских каталогов, в которых присутствует файл, что приводит к набору каталогов, содержащих файлы, - тогда делайте, как хотите, результат.
entities = os.listdir(dirpath)
for entity in entities:
if os.path.isfile(entity):
print(dirpath)
break
Если вы можете удалить каталог, вы можете использовать это:
try:
os.rmdir( submodule_absolute_path )
is_empty = True
except OSError:
is_empty = False
if is_empty:
pass
Os.rmdir удаляет каталог, только если он пуст, в противном случае он генерирует исключение OSError.
Вы можете найти обсуждение этого на:
Например, удаление пустого каталога - это хорошо, если вы планируете выполнить git-клон, но не в том случае, если вы заранее проверяете, является ли каталог пустым, поэтому ваша программа не выдает ошибку пустого каталога.
Добавляя к ответу @Jon Clements pathlib, я хотел проверить, является ли папка пустой с pathlib, но без создания набора:
from pathlib import Path
is_empty = not bool(sorted(Path('some/path/here').rglob('*')))
sorted (Path (path_here).rglob('*')) возвращает список отсортированных элементов PosixPah. Если нет элементов, он возвращает пустой список, который является ложным. Таким образом, is_empty будет True, если путь пуст, и false, если путь имеет что-то
Аналогичные результаты идеи {} и [] дают то же самое:
Вы можете использовать этот простой код:
dir_contents = [x for x in os.listdir('.') if not x.startswith('.')]
if len(dir_contents) > 0:
print("Directory contains files")
Он проверяет файлы и каталоги в текущем рабочем каталоге (.
). Вы можете изменить .
в os.listdir()
чтобы проверить любой другой каталог.
Вы можете напрямую использовать генератор вместо того, чтобы сначала преобразовывать в набор или (упорядоченный) список:
from pathlib import Path
p = Path('abc')
def check_dir(p):
if not p.exists():
print('This directory is non-existent')
return
try:
next(p.rglob('*'))
except StopIteration:
print('This directory is empty')
return
print('OK')