파이썬에서 최상위 디렉토리 만 나열하는 방법은 무엇입니까?
일부 폴더 내의 디렉토리 만 나열하고 싶습니다. 즉, 파일 이름을 나열하지 않고 추가 하위 폴더를 원하지 않습니다.
예제가 도움이되는지 봅시다. 현재 디렉토리에는 다음이 있습니다.
>>> 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를 사용하여 최상위 수준을 반환하는 것만으로도 비효율적입니다.
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']
os.walk
next(os.walk('.'))[1]
들어 파이썬 <2.5 = 사용 :
os.walk('.').next()[1]
작동 원리
os.walk
은 생성기이며 호출 next
은 3 개의 튜플 (dirpath, dirnames, filenames) 형식으로 첫 번째 결과를 얻습니다. 따라서 [1]
인덱스는 dirnames
해당 튜플에서 만 반환합니다 .
os.path.isdir을 사용하여 디렉토리를 감지하여 목록을 필터링하십시오.
filter(os.path.isdir, os.listdir(os.getcwd()))
directories=[d for d in os.listdir(os.getcwd()) if os.path.isdir(d)]
을 수행하는 대신을 수행하는 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)
]
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 ()의 필터링은 매우 빠릅니다.
매우 간단하고 우아한 방법은 다음을 사용하는 것입니다.
import os
dir_list = os.walk('.').next()[1]
print dir_list
폴더 이름을 원하는 동일한 폴더에서이 스크립트를 실행하십시오. 즉, 폴더의 전체 경로가없는 정확한 폴더 이름 만 제공합니다.
이것은 적어도 리눅스에서 작동하는 것 같습니다.
import glob, os
glob.glob('*' + os.path.sep)
목록 이해를 사용하여
[a for a in os.listdir() if os.path.isdir(a)]
가장 간단한 방법이라고 생각합니다
여기에 초보자 인 나는 아직 직접 언급 할 수 없지만 여기에 ΤΖΩΤΖΙΟΥ의 답변 중 다음 부분에 추가하고 싶은 작은 수정 사항이 있습니다 .
전체 경로 이름을 선호하는 경우이 기능을 사용하십시오.
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)
]
그렇지 않으면 구문 오류가 발생합니다.
[x for x in os.listdir(somedir) if os.path.isdir(os.path.join(somedir, x))]
전체 경로 이름 목록을 보려면 여기 에서 다른 솔루션 보다이 버전을 선호합니다 .
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))]
scanDir = "abc"
directories = [d for d in os.listdir(scanDir) if os.path.isdir(os.path.join(os.path.abspath(scanDir), d))]
A safer option that does not fail when there is no directory.
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 []
Like so?
>>>> [path for path in os.listdir(os.getcwd()) if os.path.isdir(path)]
-- 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
참고URL : https://stackoverflow.com/questions/141291/how-to-list-only-top-level-directories-in-python
'program story' 카테고리의 다른 글
iOS 애플리케이션에서 전역 상수를 어디에 저장합니까? (0) | 2020.08.02 |
---|---|
AngularJS의 객체 배열에서 id로 특정 객체를 가져옵니다. (0) | 2020.08.02 |
Xcode MyProjectName-Bridging-Header.h가 존재하지 않습니다 (0) | 2020.08.02 |
Symfony2 : 요청을 양식에 바인딩 한 후 양식 유효성 검증 오류를 얻는 방법 (0) | 2020.08.02 |
두 Django 앱간에 모델을 이동하는 방법 (Django 1.7) (0) | 2020.08.02 |