Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 8, 2010 12:44:55

qman
От:
Зарегистрирован: 2007-07-02
Сообщения: 444
Репутация: +  0  -
Профиль   Отправить e-mail  

Возможно ли оптимизировать код получения списка вложенных папок?

Всем привет.
Возможно ли оптимизировать код получения списка вложенных папок?

# -*- 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)) ]
Только он у меня не заработал.



Отредактировано (Апрель 8, 2010 12:56:19)

Офлайн

#2 Апрель 8, 2010 13:15:43

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Возможно ли оптимизировать код получения списка вложенных папок?

Конечно можно

from os import walk



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#3 Апрель 8, 2010 13:27:40

qman
От:
Зарегистрирован: 2007-07-02
Сообщения: 444
Репутация: +  0  -
Профиль   Отправить e-mail  

Возможно ли оптимизировать код получения списка вложенных папок?

Про функцию walk я знаю. Посмотрев примеры ее использования мне показалось что код короче не будет и быстрее выполнятся не будет. К тому же walk возвращает рекурсивно вловженные поддиректории (образно говоря все вложенные директории.) А мне нужен первый уровень вложенных директорий.
Вы можете привести простой код для walk и убедить в моей не правоте?



Офлайн

#4 Апрель 8, 2010 14:34:23

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Возможно ли оптимизировать код получения списка вложенных папок?

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).



Офлайн

#5 Апрель 9, 2010 06:57:51

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Возможно ли оптимизировать код получения списка вложенных папок?

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



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#6 Апрель 9, 2010 11:02:46

qman
От:
Зарегистрирован: 2007-07-02
Сообщения: 444
Репутация: +  0  -
Профиль   Отправить e-mail  

Возможно ли оптимизировать код получения списка вложенных папок?

PooH
Согласен, поспешил с ответом - увидел заголовок, а текст толком не прочитал.
Зато вот для всех вложенных могу предложить два забавных итератора. Правда работать будут начиная с питона 2.6
Спасибо. Буду думать как без болезнено перейти на python 2.6 (сейчас на 2.5).



Офлайн

#7 Апрель 11, 2010 05:10:13

.Serj.
От:
Зарегистрирован: 2008-09-27
Сообщения: 181
Репутация: +  0  -
Профиль   Отправить e-mail  

Возможно ли оптимизировать код получения списка вложенных папок?

Отсюда: 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



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version