파이썬에서 최상위 디렉토리 만 나열하는 방법은 무엇입니까?


132

일부 폴더 내의 디렉토리 만 나열하고 싶습니다. 즉, 파일 이름을 나열하지 않고 추가 하위 폴더를 원하지 않습니다.

예제가 도움이되는지 봅시다. 현재 디렉토리에는 다음이 있습니다.

>>> os.listdir(os.getcwd())
['cx_Oracle-doc', 'DLLs', 'Doc', 'include', 'Lib', 'libs', 'LICENSE.txt', 'mod_p
ython-wininst.log', 'NEWS.txt', 'pymssql-wininst.log', 'python.exe', 'pythonw.ex
e', 'README.txt', 'Removemod_python.exe', 'Removepymssql.exe', 'Scripts', 'tcl',
 'Tools', 'w9xpopen.exe']

그러나 파일 이름을 나열하고 싶지 않습니다. \ Lib \ curses와 같은 하위 폴더도 원하지 않습니다. 본질적으로 내가 원하는 것은 다음과 함께 작동합니다.

>>> for root, dirnames, filenames in os.walk('.'):
...     print dirnames
...     break
...
['cx_Oracle-doc', 'DLLs', 'Doc', 'include', 'Lib', 'libs', 'Scripts', 'tcl', 'Tools']

그러나 동일한 결과를 얻는 더 간단한 방법이 있는지 궁금합니다. os.walk를 사용하여 최상위 수준을 반환하는 것만으로도 비효율적입니다.

답변:


125

os.path.isdir ()을 사용하여 결과를 필터링하고 실제 경로를 얻으려면 os.path.join ()을 사용하십시오.

>>> [ name for name in os.listdir(thedir) if os.path.isdir(os.path.join(thedir, name)) ]
['ctypes', 'distutils', 'encodings', 'lib-tk', 'config', 'idlelib', 'xml', 'bsddb', 'hotshot', 'logging', 'doc', 'test', 'compiler', 'curses', 'site-packages', 'email', 'sqlite3', 'lib-dynload', 'wsgiref', 'plat-linux2', 'plat-mac']

17
이는 매우 간단한 처리 os.walk 대 많이 걸릴 () 다음에 (). [1]
Phyo Arkar Lwin

203

os.walk

아이템 기능 os.walk과 함께 사용 next:

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

들어 파이썬 <2.5 = 사용 :

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

작동 원리

os.walk은 생성기이며 호출 next은 3 개의 튜플 (dirpath, dirnames, filenames) 형식으로 첫 번째 결과를 얻습니다. 따라서 [1]인덱스는 dirnames해당 튜플에서 만 반환합니다 .


14
이것에 대한 좀 더 자세한 설명은 이것이 발전기라는 것입니다. 따라서 .next () [1]은 모든 목록 이해가하는 일을 한 줄로 수행합니다. 아마 뭔가를 할 거라고 DIRNAMES=1다음과 next()[DIRNAMES]쉽게 미래의 코드 테이너에 대해 이해할 수 있도록 할 수 있습니다.
보트 코더

3
+1 놀라운 솔루션. 탐색 할 디렉토리를 지정하려면 다음을 사용하십시오.os.walk( os.path.join(mypath,'.')).next()[1]
Daniel Reis

42
파이썬 v3의 경우 : next (os.walk ( '.')) [1]
Andre Soares

텍스트 처리보다 더 많은 일을하려는 경우 즉, 실제 폴더에서 처리하면 전체 경로가 필요할 수 있습니다.sorted( [os.path.join(os.getcwd(), item) for item in os.walk(os.curdir).next()[1]] )
DevPlayer

52

os.path.isdir을 사용하여 디렉토리를 감지하여 목록을 필터링하십시오.

filter(os.path.isdir, os.listdir(os.getcwd()))

5
나는 이것이 모든 대답에서 가독성과 간결성의 가장 좋은 조합이라고 생각합니다.
vergenzt

20
이 작동하지 않았다. 내 생각 엔 os.listdir에 전달 된 파일 / 폴더 이름 을 반환 os.path.isdir하지만 후자는 전체 경로가 필요합니다.
Daniel Reis

3
필터가 os.walk보다 빠름 timeit(os.walk(os.getcwd()).next()[1]) 1000 loops, best of 3: 734 µs per loop timeit(filter(os.path.isdir, os.listdir(os.getcwd()))) 1000 loops, best of 3: 477 µs per loop
B.Kocis

14
directories=[d for d in os.listdir(os.getcwd()) if os.path.isdir(d)]

4
이것은 필터 (os.path.isdir, os.listdir (os.getcwd ())로 단축 할 수
존 밀리 킨

3
누구든지 필터 또는 목록 이해가 더 빠른지에 대한 정보가 있습니까? 그렇지 않으면 그것은 단지 주관적인 주장입니다. 이것은 물론 cwd에 천만 개의 디렉토리가 있고 성능이 문제라고 가정합니다.
Mark Roddy

12

을 수행하는 대신을 수행하는 os.listdir(os.getcwd())것이 좋습니다 os.listdir(os.path.curdir). 하나의 적은 함수 호출로 이식성이 뛰어납니다.

따라서 답을 완성하려면 폴더의 디렉토리 목록을 얻으십시오.

def listdirs(folder):
    return [d for d in os.listdir(folder) if os.path.isdir(os.path.join(folder, d))]

전체 경로 이름을 선호하는 경우이 기능을 사용하십시오.

def listdirs(folder):
    return [
        d for d in (os.path.join(folder, d1) for d1 in os.listdir(folder))
        if os.path.isdir(d)
    ]

9

이것은 적어도 리눅스에서 작동하는 것 같습니다.

import glob, os
glob.glob('*' + os.path.sep)

1
일에 대한 glob. 그것은 당신에게 코드, 특히 반복을 많이 저장하고, UNIX 터미널 사용 (에 매우 가깝다 수 ls)
제라드

5
glob.glob ( '*'+ os.path.sep) 대신 [os.path.isdir (dir) 인 경우 glob.glob ( "*")에 dir에 대한 dir을 작성하고 싶을 수도 있습니다.
Eamonn MR

8

os.listdir ()을 사용하는 것은 "매우 간단한 os.walk (). next () [1]"에 비해 많은 처리를 하지 않습니다 . os.walk ()는 os.listdir ()을 내부적으로 사용하기 때문입니다. 실제로 함께 테스트하면 :

>>>> import timeit
>>>> timeit.timeit("os.walk('.').next()[1]", "import os", number=10000)
1.1215229034423828
>>>> timeit.timeit("[ name for name in os.listdir('.') if os.path.isdir(os.path.join('.', name)) ]", "import os", number=10000)
1.0592019557952881

os.listdir ()의 필터링은 매우 빠릅니다.



1
pep-0471 ( scandir패키지)은 Python 2.6 이상에서 PyPI에 설치 가능한 패키지로 제공됩니다. 그것은에 대한 대체를 제공 os.walk하고 os.listdir그 훨씬 빠릅니다.
foz 2012

6

매우 간단하고 우아한 방법은 다음을 사용하는 것입니다.

 import os
 dir_list = os.walk('.').next()[1]
 print dir_list

폴더 이름을 원하는 동일한 폴더에서이 스크립트를 실행하십시오. 즉, 폴더의 전체 경로가없는 정확한 폴더 이름 만 제공합니다.


6

목록 이해를 사용하여

[a for a in os.listdir() if os.path.isdir(a)]

가장 간단한 방법이라고 생각합니다


2

여기에 초보자 인 나는 아직 직접 언급 할 수 없지만 여기에 다음 부분에 추가하고 싶은 작은 수정 사항입니다. ΤΖΩΤΖΙΟΥ의 답변 .

전체 경로 이름을 선호하는 경우이 기능을 사용하십시오.

def listdirs(folder):  
  return [
    d for d in (os.path.join(folder, d1) for d1 in os.listdir(folder))
    if os.path.isdir(d)
]

여전히 파이썬 <2.4 인 사람들을 위해 : 내부 구조는 튜플 대신 목록이어야하므로 다음과 같이 읽어야합니다.

def listdirs(folder):  
  return [
    d for d in [os.path.join(folder, d1) for d1 in os.listdir(folder)]
    if os.path.isdir(d)
  ]

그렇지 않으면 구문 오류가 발생합니다.


나는 그것이 오래되었다는 것을 알고 있지만,이 첫 번째 예가 실제로 도움이되었습니다.
인바 로즈

1
버전이 생성기 표현식을 지원하지 않기 때문에 구문 오류가 발생합니다. 이것들은 파이썬 2.4에서 소개되었지만리스트 이해는 파이썬 2.0부터 사용 가능합니다.
awatts

1
[x for x in os.listdir(somedir) if os.path.isdir(os.path.join(somedir, x))]

1

전체 경로 이름 목록을 보려면 여기 에서 다른 솔루션 보다이 버전을 선호합니다 .

def listdirs(dir):
    return [os.path.join(os.path.join(dir, x)) for x in os.listdir(dir) 
        if os.path.isdir(os.path.join(dir, x))]

1
scanDir = "abc"
directories = [d for d in os.listdir(scanDir) if os.path.isdir(os.path.join(os.path.abspath(scanDir), d))]

0

디렉토리가 없어도 실패하지 않는 안전한 옵션입니다.

def listdirs(folder):
    if os.path.exists(folder):
         return [d for d in os.listdir(folder) if os.path.isdir(os.path.join(folder, d))]
    else:
         return []


0

Python 3.4는 파일 라이브러리 경로를 처리하기위한 객체 지향 접근 방식을 제공하는 모듈 을 표준 라이브러리에 도입 했습니다pathlib .

from pathlib import Path

p = Path('./')
[f for f in p.iterdir() if f.is_dir()]

-1
-- This will exclude files and traverse through 1 level of sub folders in the root

def list_files(dir):
    List = []
    filterstr = ' '
    for root, dirs, files in os.walk(dir, topdown = True):
        #r.append(root)
        if (root == dir):
            pass
        elif filterstr in root:
            #filterstr = ' '
            pass
        else:
            filterstr = root
            #print(root)
            for name in files:
                print(root)
                print(dirs)
                List.append(os.path.join(root,name))
            #print(os.path.join(root,name),"\n")
                print(List,"\n")

    return List
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.