programing

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

muds 2023. 7. 5. 21:02
반응형

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

일부 폴더에 있는 디렉토리만 나열할 수 있습니다.즉, 파일 이름을 나열하거나 추가 하위 폴더를 사용하지 않습니다.

사례가 도움이 되는지 알아보겠습니다.현재 디렉터리에는 다음이 있습니다.

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

반응형