2015-09-02 3 views
0

Я хотел бы получить список всех каталогов внутри IMAGE_DIRECTORY, не включая себя. Проверка каждой записи кажется субоптимальной. Есть лучший способ сделать это?Лучший способ перечислить все каталоги в Python, кроме себя?

for dir in [x[0] for x in os.walk(IMAGE_DIRECTORY)]: 
     if(dir != IMAGE_DIRECTORY): 
      files = [dir + "/" + file for file in os.listdir(dir)]    
      list_of_files.extend(files) 

Просто хотел сказать спасибо за разнообразные ответы! Так много разных ответов так быстро!

+0

Первым улучшением будет использование генераторных выражений вместо генераторов списков. –

+1

Если вы хотите, чтобы все каталоги * исключая * корень, не будет ли вторая часть возврата более полезной для вас, чем первая? – jonrsharpe

ответ

0

Просто пропустите первый элемент:

walker = iter(os.walk(IMAGE_DIRECTORY)) 
next(walker) 
for path, files, _ in walker: 
    list_of_files.extend(os.path.join(path, f) in files) 
+0

3-й бит на самом деле является подкаталогами ... так что то, что он должен использовать ... его код расширяет файлы ... но его вопрос не кажется имеют какое-либо отношение к файлам ... просто получая список каталогов ... также я уверен, что os.walk является генератором, поэтому не уверен, что он обертывает его в iter –

+0

Это почти то, что я хочу, кроме того, что я действительно хочу, os.listdir в каждом подкаталоге IMAGE_DIRECTORY. Благодарю. Я забыл о 'next' – sunny

+0

@sunny: os.walk уже перечисляет все файлы, не нужно os.listdir. – Daniel

0
def get_subdirs(start_dir): 
    return (os.path.join(start_dir,x) for x in next(os.walk(start_dir))[1]) 

for subdir in get_subdirs(IMAGE_DIR): 
    for fname in next(os.walk(subdir))[2]: 
     print os.path.join(subdir,fname) 

обратите внимание, что это не является рекурсивным это возвращает все каталоги непосредственно под startdir

или просто

print next(os.walk(start_dir))[1] 
+0

спасибо, но это включает в себя файлы не только подкаталогов – sunny

+0

, чтобы процитировать вас. __I хотел бы получить список всех каталогов внутри IMAGE_DIRECTORY__ ... но нормально не проблема ... так что вы также хотите, чтобы он был рекурсивным? –

+0

Нет. Я имел в виду, что я хочу, чтобы файлы были исключены. Я не хочу, чтобы он был рекурсивным. – sunny

0

Это, как сделать это в одной строке

print ['/'.join(d.split('/')[1:]) for d in [x[0] for x in os.walk(IMAGE_DIRECTORY)] if d != IMAGE_DIRECTORY] 
+0

, помещая все это в одну строку, действительно не делает его лучше или уменьшает сложность –

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