Найти - Пользователи
Полная версия: Возможно ли оптимизировать код получения списка вложенных папок?
Начало » Python для новичков » Возможно ли оптимизировать код получения списка вложенных папок?
1
qman
Всем привет.
Возможно ли оптимизировать код получения списка вложенных папок?
# -*- coding: utf-8 -*-
def get_list_files(directory):
list_files = []
for filename in os.listdir (directory):
full_name = os.path.join (directory, filename)
if os.path.isdir (full_name):
list_files.append(full_name)
return(list_files)
может его возможно оптимизировать с использованием лямбда функций?
Всем спасибо
P.S. тут нашел еще одно обсуждение http://ru.how-to.mobi/index.php?id=141291 и код
[ name for name in os.listdir(thedir) if os.path.isdir(os.path.join(thedir, name)) ]
Только он у меня не заработал.
PooH
Конечно можно
from os import walk
qman
Про функцию walk я знаю. Посмотрев примеры ее использования мне показалось что код короче не будет и быстрее выполнятся не будет. К тому же walk возвращает рекурсивно вловженные поддиректории (образно говоря все вложенные директории.) А мне нужен первый уровень вложенных директорий.
Вы можете привести простой код для walk и убедить в моей не правоте?
Ed
qman
P.S. тут нашел еще одно обсуждение http://ru.how-to.mobi/index.php?id=141291 и код
[ name for name in os.listdir(thedir) if os.path.isdir(os.path.join(thedir, name)) ]
Только он у меня не заработал.
Код рабочий и делает именно то, что вам нужно. Не заработал он у вас по одной из двух причин:
либо вы не проимпортировали os, либо не присвоили переменной thedir путь к исходному каталогу(то, что у вас в коде зовется directory).
PooH
qman
Про функцию walk я знаю. Посмотрев примеры ее использования мне показалось что код короче не будет и быстрее выполнятся не будет. К тому же walk возвращает рекурсивно вловженные поддиректории (образно говоря все вложенные директории.) А мне нужен первый уровень вложенных директорий.
Вы можете привести простой код для walk и убедить в моей не правоте?
Согласен, поспешил с ответом - увидел заголовок, а текст толком не прочитал.
Зато вот для всех вложенных могу предложить два забавных итератора. Правда работать будут начиная с питона 2.6
import os
from itertools import chain, product

top = '/home/pooh/works/asi2/asi.teller/'

#итератор по вложенным каталогам
dir_iter = (os.path.join(*x) for x in chain(*(product((x[0],),x[1]) for x in os.walk(top))))
#итератор по вложенным файлам
file_iter = (os.path.join(*x) for x in chain(*(product((x[0],),x[2]) for x in os.walk(top))))

for x in dir_iter:
print x
for x in file_iter:
print x
qman
PooH
Согласен, поспешил с ответом - увидел заголовок, а текст толком не прочитал.
Зато вот для всех вложенных могу предложить два забавных итератора. Правда работать будут начиная с питона 2.6
Спасибо. Буду думать как без болезнено перейти на python 2.6 (сейчас на 2.5).
.Serj.
Отсюда: http://www.daniweb.com/code/post968470.html

def limited_walk(folder, limit, n = 0):
"""generator similar to os.walk(), but with limited subdirectory depth"""
if n > limit:
return
for file in os.listdir(folder):
file_path = os.path.join(folder, file)
if os.path.isdir(file_path):
for item in limited_walk(file_path, limit, n + 1):
yield item
else:
yield file_path
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB