파이썬에서 최상위 디렉터리만 나열하는 방법은 무엇입니까?
일부 폴더에 있는 디렉토리만 나열할 수 있습니다.즉, 파일 이름을 나열하거나 추가 하위 폴더를 사용하지 않습니다.
사례가 도움이 되는지 알아보겠습니다.현재 디렉터리에는 다음이 있습니다.
>>> 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\curs와 같은 하위 폴더도 원하지 않습니다.기본적으로 제가 원하는 것은 다음과 같습니다.
>>> for root, dirnames, filenames in os.walk('.'):
... print dirnames
... break
...
['cx_Oracle-doc', 'DLLs', 'Doc', 'include', 'Lib', 'libs', 'Scripts', 'tcl', 'Tools']
하지만, 저는 같은 결과를 얻을 수 있는 더 간단한 방법이 있는지 궁금합니다.os.walk를 사용하여 최상위 레벨만 반환하는 것은 비효율적이라는 인상을 받습니다.
os.산책
항목 기능과 함께 사용:
next(os.walk('.'))[1]
Python <=2.5의 경우 다음을 사용합니다.
os.walk('.').next()[1]
작동 방식
os.walk
생성기 및 호출입니다.next
첫 번째 결과를 3-슬래플 형태로 가져옵니다(슬래시 경로, dirnames, 파일 이름).그러므로[1]
인덱스는 다음만 반환합니다.dirnames
그 튜플에서.
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.path.isdir를 사용하여 목록을 필터링하여 디렉터리를 검색합니다.
filter(os.path.isdir, os.listdir(os.getcwd()))
directories=[d for d in os.listdir(os.getcwd()) if os.path.isdir(d)]
이것도 작동하는 것 같습니다(적어도 Linux에서는).
import glob, os
glob.glob('*' + os.path.sep)
목록 이해력을 사용하여,
[a for a in os.listdir() if os.path.isdir(a)]
그것이 가장 간단한 방법이라고 생각합니다.
참고로, 하는 대신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
폴더 이름을 지정할 폴더에서 이 스크립트를 실행합니다.폴더의 전체 경로가 없는 즉시 폴더 이름만 제공됩니다.
다음을 사용할 수도 있습니다.
with os.scandir(os.getcwd()) as mydir:
dirs = [i.name for i in mydir if i.is_dir()]
사용할 수 있는 전체 경로를 원하는 경우i.path
.
listdir() 대신 scandir()를 사용하면 os로 인해 파일 형식이나 파일 속성 정보가 필요한 코드의 성능을 크게 향상시킬 수 있습니다.DirEntry 개체는 디렉터리를 검색할 때 운영 체제에서 제공하는 경우 이 정보를 표시합니다.
[x for x in os.listdir(somedir) if os.path.isdir(os.path.join(somedir, x))]
Python 3.4는 표준 라이브러리에 모듈을 도입하여 파일 시스템 경로를 처리하는 객체 지향 접근 방식을 제공합니다.
from pathlib import Path
p = Path('./')
[f for f in p.iterdir() if f.is_dir()]
2021년 답은 다음을 사용합니다.
import glob, os
p = "/some/path/"
for d in glob.glob(p + "*" + os.path.sep):
print(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) ]
python < 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)
]
그렇지 않으면 구문 오류가 발생합니다.
전체 경로 이름 목록을 보려면 다른 솔루션보다 이 버전을 선호합니다.
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))]
그런 식으로?
>>>> [path for path in os.listdir(os.getcwd()) if os.path.isdir(path)]
, FWIW, »os.walk
접근 방식은 목록 이해 및 필터 접근 방식보다 거의 10배 빠릅니다.
In [30]: %timeit [d for d in os.listdir(os.getcwd()) if os.path.isdir(d)]
1.23 ms ± 97.8 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [31]: %timeit list(filter(os.path.isdir, os.listdir(os.getcwd())))
1.13 ms ± 13.8 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [32]: %timeit next(os.walk(os.getcwd()))[1]
132 µs ± 9.34 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
pathlib와 함께 python 3.x 사용.경로.iter_dir
$ mkdir tmpdir
$ mkdir -p tmpdir/a/b/c
$ mkdir -p tmpdir/x/y/z
$ touch tmpdir/a/b/c/abc.txt
$ touch tmpdir/a/b/ab.txt
$ touch tmpdir/a/a.txt
$ python --version
Python 3.7.12
>>> from pathlib import Path
>>> tmpdir = Path("./tmpdir")
>>> [d for d in tmpdir.iterdir() if d.is_dir]
[PosixPath('tmpdir/x'), PosixPath('tmpdir/a')]
>>> sorted(d for d in tmpdir.iterdir() if d.is_dir)
[PosixPath('tmpdir/a'), PosixPath('tmpdir/x')]
디렉토리가 없을 때 실패하지 않는 안전한 선택사항입니다.
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 []
-- 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
'programing' 카테고리의 다른 글
.SD는 R의 data.table에서 무엇을 나타냅니까? (0) | 2023.07.05 |
---|---|
Oracle SQL에서 인덱스를 표시하는 방법 (0) | 2023.07.05 |
C에서 부울(부울)은 얼마나 많은 공간을 차지합니까?1비트인가요, 1바이트인가요? (0) | 2023.07.05 |
Spring application.properties 파일에서 식 사용 (0) | 2023.07.05 |
Oracle DB에서 Ghost 제약 조건 찾기 (0) | 2023.07.05 |