Форум сайта python.su
Всем привет.
Возможно ли оптимизировать код получения списка вложенных папок?
# -*- 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)
[ name for name in os.listdir(thedir) if os.path.isdir(os.path.join(thedir, name)) ]
Отредактировано (Апрель 8, 2010 12:56:19)
Офлайн
Конечно можно
from os import walk
Офлайн
Про функцию walk я знаю. Посмотрев примеры ее использования мне показалось что код короче не будет и быстрее выполнятся не будет. К тому же walk возвращает рекурсивно вловженные поддиректории (образно говоря все вложенные директории.) А мне нужен первый уровень вложенных директорий.
Вы можете привести простой код для walk и убедить в моей не правоте?
Офлайн
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)) ]
Офлайн
qmanСогласен, поспешил с ответом - увидел заголовок, а текст толком не прочитал.
Про функцию walk я знаю. Посмотрев примеры ее использования мне показалось что код короче не будет и быстрее выполнятся не будет. К тому же walk возвращает рекурсивно вловженные поддиректории (образно говоря все вложенные директории.) А мне нужен первый уровень вложенных директорий.
Вы можете привести простой код для walk и убедить в моей не правоте?
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
Офлайн
PooHСпасибо. Буду думать как без болезнено перейти на python 2.6 (сейчас на 2.5).
Согласен, поспешил с ответом - увидел заголовок, а текст толком не прочитал.
Зато вот для всех вложенных могу предложить два забавных итератора. Правда работать будут начиная с питона 2.6
Офлайн
Отсюда: 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
Офлайн