2015-08-01 4 views
3

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

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

Есть ли способ сделать это в Python?

Редактировать: Я должен уточнить, что мой вопрос касается производительности извлечения каталогов. Я уже знаю несколько способов получить каталоги, но они все замедлились, если в рабочем каталоге есть куча файлов.

+0

Примерно, сколько записей находится в каталоге? – FMc

+2

Учитывая, что каталоги представляют собой не что иное, как таблицы с записями формы '| name | inode | very-little-else |' Я сомневаюсь, что будет способ сделать то, о чем вы просите. Даже если бы функция возвращала только каталоги, ей все равно пришлось бы перебирать все строки, пытаясь выяснить, какая запись соответствует подкаталогу, а какая нет. Я пытаюсь сказать, что «ФАЙЛЫ ДИНАМИК» и обычные файлы сбрасываются вместе, а не отдельно. – rohithpr

+0

@FMc: Есть произвольное количество файлов. Я просматриваю каталог, о котором я ничего не знаю заранее, поэтому я должен учитывать каталог, который может содержать любое количество файлов. – Novark

ответ

1

Невозможно только восстановить каталоги из операционной системы. Вы должны отфильтровать результаты. Хотя, похоже, использование os.scandir повышает производительность порядка magnitude (см. Тесты) по сравнению с os.listdir и старшей версией os.walk, поскольку она позволяет избежать получения чего-либо, кроме метаданных, где это возможно. Если вы используете 3.5, он уже интегрирован в стандартную библиотеку. В противном случае, похоже, вам нужно использовать пакет scandir.

Чтобы отфильтровать результаты от os.scandir

ds = [e.name() for e in os.scandir('.') if e.is_dir()] 

Согласно документации, walk осуществляется в терминах scandir, которая также дает тот же ускорение.

1

Не уверен, есть ли какие-либо прямые стандартные функции, которые сделают это для вас. Но Вы можете использовать os.walk() для этого, каждая итерация os.walk() возвращает кортеж формата -

(dirpath, dirnames, filenames) 

Где dirpath это каталог будучи шел в настоящее время, dirnames содержит каталоги внутри dirpath и filenames содержит файлы внутри него ,

Вы можете просто позвонить по телефону next(os.walk()), чтобы получить приведенный выше кортеж для каталога, а второй элемент (индекс - 1) в этом кортеже будет подпапками внутри каталога.

код -

direcs = next(os.walk('.'))[1] 

direcs в конце будет список подпапок текущей папки. Вы также можете указать другую папку, чтобы получить список папок внутри нее.

+0

Я пробовал использовать os.walk и несколько его вариантов, однако все они перебирают файлы, что приводит к замедлению, когда вам нужно пройти через папку с кучей файлов. Наверное, я должен был уточнить, что мой вопрос конкретно касается производительности восстановления подкаталогов. – Novark

+0

'os.walk()' не выполняет итерацию по подкаталогам немедленно, он перебирает их только при переходе через 'os.wak()', в приведенном выше коде вы просто получаете поддиректории первого уровня и файлы, не итерации внутри подкаталога. –

+0

os.walk() не работает для меня, потому что он также извлекает файлы в дополнение к каталогам, что может привести к замедлению. – Novark