2014-09-04 2 views
19

Я искал везде для ответа, но не могу найти его.Как проверить, содержит ли папка файлы с использованием python 3

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

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

Вот сценарий, который пришел ближе:

for dirpath, dirnames, files in os.walk('.'): 
if os.listdir(dirpath)==[]: 
    print(dirpath) 

Это перечислит все вложенные папки, которые являются пустыми, но если я пытаюсь изменить его на:

if os.listdir(dirpath)!=[]: 
    print(dirpath) 

она будет перечислять все - не только вложенные папки, содержащие файлы.

Я был бы очень признателен, если бы кто-то мог указать мне в правильном направлении.

Это для Python 3.4, если это имеет значение.

Спасибо за любую помощь, которую вы можете мне дать.

+1

Под «пустым» вы подразумеваете «не содержит ничего (кроме' .' и '..')» или «не содержит ничего, кроме подкаталогов», или «не содержит никаких обычных файлов», , или "не содержит никаких скрытых обычных файлов" или что-то другое? – abarnert

+1

Между тем, почему вы используете 'os.walk', а затем также используете' os.listdir' на каждом 'dirpath'?У вас уже есть 'dirnames' и' files'; зачем вызывать функцию, чтобы получить ту же самую информацию, которую у вас уже есть? – abarnert

+1

Наконец, вы почти никогда не хотите проверять '! = []' Или '== []'. Просто используйте тот факт, что пустые последовательности являются ложными, а непустые последовательности правдивы: 'if not os.listdir (dirpath):' будет делать то, что вы хотите. – abarnert

ответ

13

«файлы» уже сообщают вам, что находится в каталоге. Просто проверьте его:

for dirpath, dirnames, files in os.walk('.'): 
    if files: 
     print(dirpath, 'has files') 
    if not files: 
     print(dirpath, 'is empty') 
+0

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

+0

Duh - Я просто решил удалить строку «if not» из кода и получить именно то, что мне нужно. Большое спасибо всем за вашу помощь от этого новичка до Python. :) – Heather

+0

LOL - это было показано как из-за того, что в вашем коде были '==' и '! =' Примеры. Я мог бы быть более ясным. – tdelaney

3
entities = os.listdir(dirpath) 
for entity in entities: 
    if os.path.isfile(entity): 
     print(dirpath) 
     break 
8

Вы можете использовать новую 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()} 

Поскольку вы должны ходить по дереву в любом случае , мы создаем набор родительских каталогов, в которых присутствует файл, который приводит к набору каталогов, содержащих файлы, - тогда делайте, как хотите, с результатом.

1

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

try: 
    os.rmdir(submodule_absolute_path) 
    is_empty = True 

except OSError: 
    is_empty = False 

if is_empty: 
    pass 

os.rmdir только удаляет папку, если она пуста, в противном случае он бросает исключение OSError.

Вы можете найти обсуждение этого на:

  1. https://bytes.com/topic/python/answers/157394-how-determine-if-folder-empty

Например, удаление пустой папки прекрасно, когда вы планируете сделать GIT клон, но вы заранее проверить будет ли папка пуста, так что git не бросает ошибку пустой папки.

Смежные вопросы