답변:
즉각적인 서브 디렉토리 또는 트리 바로 아래의 모든 디렉토리를 의미합니까?
어느 쪽이든, 당신 os.walk
은 이것을 할 수 있습니다 :
os.walk(directory)
각 하위 디렉토리에 대한 튜플을 생성합니다. 3- 튜플의 첫 번째 항목은 디렉토리 이름이므로
[x[0] for x in os.walk(directory)]
모든 하위 디렉토리를 재귀 적으로 제공해야합니다.
튜플의 두 번째 항목은 첫 번째 위치에있는 항목의 하위 디렉토리 목록이므로이를 대신 사용할 수는 있지만 크게 절약 할 수는 없습니다.
그러나 즉시 하위 디렉토리를 제공하기 위해 사용할 수 있습니다.
next(os.walk('.'))[1]
아니면 다른 솔루션 이미 게시하여 참조 os.listdir
및 os.path.isdir
"에 포함, 파이썬에서 즉시 모든 하위 디렉터리를 얻을 수 있습니다 "를.
os.walk('.').next()[1]
또는 os.walk('.').__next__()[1]
직접. 대신 내장 함수를 사용하십시오.이 함수 next()
는 Python 2 (doc 참조) 및 Python 3 (doc 참조 ) 모두에서 사용할 수 있습니다 . 예를 들면 다음과 같습니다 next(os.walk('.'))[1]
..
os.walk('.').next()[1]
직접 사용하는 것이 나쁜 가요?
os.walk
과 같이 10,000 개의 하위 디렉토리 (아래 계층에 수백만 개의 파일 포함)가있는 디렉토리에서 테스트했으며 성능 차이는 무시할 수 있습니다. "10 개 루프, 3 최고 : 루프 당 44.6 밀리 초"와 + : "10 개 루프, 3 최고 : 루프 당 45.1 밀리 초"os.listdir
os.path.isdir
os.walk
os.listdir
os.path.isdir
import os
d = '.'
[os.path.join(d, o) for o in os.listdir(d)
if os.path.isdir(os.path.join(d,o))]
os.path.join
에 o
전체 경로를 얻을 그렇지 않으면 isdir(0)
항상 false를 반환합니다
os.path.join
두 번 전화하지 않으려면 먼저 다음을 사용하여 목록에 os.path.isdir
filter(os.path.isdir, [os.path.join(d, o) for o in os.listdir(d)])
당신은 그냥 사용할 수 있습니다 glob.glob
from glob import glob
glob("/path/to/directory/*/")
의 후행 /
을 잊지 마십시오 *
.
/
이름에
/
폴더 구분자로 가정 할 수없는 경우 다음 과 같이하십시오.glob(os.path.join(path_to_directory, "*", ""))
recursive=True
여러 os.path.join ()이 필요없고 전체 경로를 직접 얻을 수 있기 때문에 위의 것보다 훨씬 좋습니다. 원하는 경우 Python 3.5 이상 에서이 작업을 수행 할 수 있습니다 .
subfolders = [ f.path for f in os.scandir(folder) if f.is_dir() ]
하위 디렉토리의 전체 경로를 제공합니다. 하위 디렉토리의 이름 만 원한다면 f.name
대신f.path
https://docs.python.org/3/library/os.html#os.scandir
약간 OT : 모든 하위 폴더를 재귀 적으로 필요로 하는 경우 및 / 또는 모든 파일을 재귀 적 으로 필요로하는 경우이 기능을 살펴보십시오.이 기능은 os.walk
& 보다 빠르며 glob
모든 하위 폴더의 목록뿐만 아니라 (하위) 하위 폴더 내의 모든 파일을 반환합니다. https://stackoverflow.com/a/59803793/2441026
모든 하위 폴더 만 재귀 적으로 원할 경우 :
def fast_scandir(dirname):
subfolders= [f.path for f in os.scandir(dirname) if f.is_dir()]
for dirname in list(subfolders):
subfolders.extend(fast_scandir(dirname))
return subfolders
전체 경로가있는 모든 하위 폴더의 목록을 반환합니다. 이것은 다시보다 빠릅니다os.walk
훨씬 빠릅니다 glob
.
모든 기능의 분석
tl; dr :
- 폴더에 대한 모든 직접적인 하위 디렉토리 를 얻으려면을 사용하십시오 os.scandir
.
- 당신이 얻고 싶은 경우에 모든 하위 디렉토리, 심지어 중첩 된 것들, 사용 os.walk
약간 빠른 - - 또는 ▶ fast_scandir
위의 함수를.
- os.walk
수백 (!) 배보다 느릴 수 있으므로 최상위 서브 디렉토리에만 사용하지 마십시오 os.scandir
.
os.walk
는 기본 폴더입니다. 따라서 하위 디렉토리 만 얻을 수는 없습니다. 당신이 사용할 수있는fu.pop(0)
제거하는 데 .결과 :
os.scandir took 1 ms. Found dirs: 439
os.walk took 463 ms. Found dirs: 441 -> it found the nested one + base folder.
glob.glob took 20 ms. Found dirs: 439
pathlib.iterdir took 18 ms. Found dirs: 439
os.listdir took 18 ms. Found dirs: 439
W7x64, Python 3.8.1로 테스트되었습니다.
# -*- coding: utf-8 -*-
# Python 3
import time
import os
from glob import glob
from pathlib import Path
directory = r"<insert_folder>"
RUNS = 1
def run_os_walk():
a = time.time_ns()
for i in range(RUNS):
fu = [x[0] for x in os.walk(directory)]
print(f"os.walk\t\t\ttook {(time.time_ns() - a) / 1000 / 1000 / RUNS:.0f} ms. Found dirs: {len(fu)}")
def run_glob():
a = time.time_ns()
for i in range(RUNS):
fu = glob(directory + "/*/")
print(f"glob.glob\t\ttook {(time.time_ns() - a) / 1000 / 1000 / RUNS:.0f} ms. Found dirs: {len(fu)}")
def run_pathlib_iterdir():
a = time.time_ns()
for i in range(RUNS):
dirname = Path(directory)
fu = [f for f in dirname.iterdir() if f.is_dir()]
print(f"pathlib.iterdir\ttook {(time.time_ns() - a) / 1000 / 1000 / RUNS:.0f} ms. Found dirs: {len(fu)}")
def run_os_listdir():
a = time.time_ns()
for i in range(RUNS):
dirname = Path(directory)
fu = [os.path.join(directory, o) for o in os.listdir(directory) if os.path.isdir(os.path.join(directory, o))]
print(f"os.listdir\t\ttook {(time.time_ns() - a) / 1000 / 1000 / RUNS:.0f} ms. Found dirs: {len(fu)}")
def run_os_scandir():
a = time.time_ns()
for i in range(RUNS):
fu = [f.path for f in os.scandir(directory) if f.is_dir()]
print(f"os.scandir\t\ttook {(time.time_ns() - a) / 1000 / 1000 / RUNS:.0f} ms.\tFound dirs: {len(fu)}")
if __name__ == '__main__':
run_os_scandir()
run_os_walk()
run_glob()
run_pathlib_iterdir()
run_os_listdir()
필자는 필터 ( https://docs.python.org/2/library/functions.html#filter )를 선호 하지만 이것은 맛의 문제 일뿐입니다.
d='.'
filter(lambda x: os.path.isdir(os.path.join(d, x)), os.listdir(d))
python-os-walk를 사용하여 이것을 구현했습니다. ( http://www.pythonforbeginners.com/code-snippets-source-code/python-os-walk/ )
import os
print("root prints out directories only from what you specified")
print("dirs prints out sub-directories from root")
print("files prints out all files from root and directories")
print("*" * 20)
for root, dirs, files in os.walk("/var/log"):
print(root)
print(dirs)
print(files)
os.listdir (path)를 사용하여 Python 2.7에서 서브 디렉토리 및 파일 목록을 가져올 수 있습니다.
import os
os.listdir(path) # list of subdirectories and files
os.listdir
파일을 포함하여 디렉토리의 내용 을 나열 하는 것을주의하십시오 .
print("\nWe are listing out only the directories in current directory -")
directories_in_curdir = filter(os.path.isdir, os.listdir(os.curdir))
print(directories_in_curdir)
files = filter(os.path.isfile, os.listdir(os.curdir))
print("\nThe following are the list of all files in the current directory -")
print(files)
Python 3.4는 파일 라이브러리 경로를 처리하기위한 객체 지향 접근 방식을 제공하는 모듈 을 표준 라이브러리에 도입 했습니다pathlib
.
from pathlib import Path
p = Path('./')
# List comprehension
[f for f in p.iterdir() if f.is_dir()]
# The trailing slash to glob indicated directories
# This will also include the current directory '.'
list(p.glob('**/'))
Pathlib는 PyPi 의 pathlib2 모듈을 통해 Python 2.7에서도 사용할 수 있습니다 .
for f in filter(Path.is_dir, p.iterdir()):
Python 3.4 및 Windows UNC 경로를 사용 하여이 문제를 우연히 발견했기 때문에이 환경에 대한 변형이 있습니다.
from pathlib import WindowsPath
def SubDirPath (d):
return [f for f in d.iterdir() if f.is_dir()]
subdirs = SubDirPath(WindowsPath(r'\\file01.acme.local\home$'))
print(subdirs)
Pathlib는 Python 3.4의 새로운 기능이며 다른 OS에서 경로 작업을 훨씬 쉽게 만듭니다. https://docs.python.org/3.4/library/pathlib.html
이 질문은 오래 전에 답변되었지만. pathlib
Windows 및 Unix OS에서 작동하는 강력한 방법이므로 모듈 을 사용하는 것이 좋습니다 .
하위 디렉토리를 포함하여 특정 디렉토리의 모든 경로를 가져 오려면 다음을 수행하십시오.
from pathlib import Path
paths = list(Path('myhomefolder', 'folder').glob('**/*.txt'))
# all sorts of operations
file = paths[0]
file.name
file.stem
file.parent
file.suffix
기타
팁 주셔서 감사합니다. 소프트 링크 (무한 재귀)가 dirs로 반환되는 문제가 발생했습니다. 소프트 링크? 우린 소프트 링크를 원하지 않습니다! 그래서...
이것은 소프트 링크가 아닌 단지 dirs를 렌더링했습니다.
>>> import os
>>> inf = os.walk('.')
>>> [x[0] for x in inf]
['.', './iamadir']
[x[0] for x in inf]
파이썬에서 무엇이 호출되어 그것을 찾을 수 있습니까?
친화적 붙여 넣기 복사 ipython
:
import os
d='.'
folders = list(filter(lambda x: os.path.isdir(os.path.join(d, x)), os.listdir(d)))
출력 print(folders)
:
['folderA', 'folderB']
x
는 목록에서 파일 을 필터링하기 위해 명령을 사용하는 파일 및 폴더를 반환 os.listdir(d)
하기 때문에 생성 된 목록의 항목입니다 . listdir
filter
os.path.isdir
이것이 내가하는 방법입니다.
import os
for x in os.listdir(os.getcwd()):
if os.path.isdir(x):
print(x)
Eli Bendersky의 솔루션을 기반으로 다음 예를 사용하십시오.
import os
test_directory = <your_directory>
for child in os.listdir(test_directory):
test_path = os.path.join(test_directory, child)
if os.path.isdir(test_path):
print test_path
# Do stuff to the directory "test_path"
<your_directory>
통과하려는 디렉토리의 경로는 어디 입니까?
최근에 비슷한 질문이 있었고 python 3.6 (사용자 havlock이 추가됨)에 대한 가장 좋은 대답은을 사용하는 것임을 알았습니다 os.scandir
. 그것을 사용하는 솔루션이없는 것 같아서 직접 추가 할 것입니다. 먼저 루트 디렉토리 바로 아래에 하위 디렉토리 만 나열하는 비 재귀 솔루션입니다.
def get_dirlist(rootdir):
dirlist = []
with os.scandir(rootdir) as rit:
for entry in rit:
if not entry.name.startswith('.') and entry.is_dir():
dirlist.append(entry.path)
dirlist.sort() # Optional, in case you want sorted directory names
return dirlist
재귀 버전은 다음과 같습니다.
def get_dirlist(rootdir):
dirlist = []
with os.scandir(rootdir) as rit:
for entry in rit:
if not entry.name.startswith('.') and entry.is_dir():
dirlist.append(entry.path)
dirlist += get_dirlist(entry.path)
dirlist.sort() # Optional, in case you want sorted directory names
return dirlist
entry.path
하위 디렉토리의 절대 경로를 사용 한다는 점을 명심 하십시오. 폴더 이름 만 필요한 경우 entry.name
대신 사용할 수 있습니다 . 객체 에 대한 자세한 내용은 os.DirEntry 를 참조하십시오 entry
.
이런 식으로 필터 기능 os.path.isdir
을 사용 os.listdir()
하십시오.filter(os.path.isdir,[os.path.join(os.path.abspath('PATH'),p) for p in os.listdir('PATH/')])
주어진 파일 경로 내의 모든 하위 디렉토리 목록을 반환하는 기능. 전체 파일 트리를 검색합니다.
import os
def get_sub_directory_paths(start_directory, sub_directories):
"""
This method iterates through all subdirectory paths of a given
directory to collect all directory paths.
:param start_directory: The starting directory path.
:param sub_directories: A List that all subdirectory paths will be
stored to.
:return: A List of all sub-directory paths.
"""
for item in os.listdir(start_directory):
full_path = os.path.join(start_directory, item)
if os.path.isdir(full_path):
sub_directories.append(full_path)
# Recursive call to search through all subdirectories.
get_sub_directory_paths(full_path, sub_directories)
return sub_directories
os.walk () 를 사용하여 모든 폴더의 목록을 얻을 수 있습니다
import os
path = os.getcwd()
pathObject = os.walk(path)
이 pathObject 는 객체이며 다음과 같이 배열을 얻을 수 있습니다.
arr = [x for x in pathObject]
arr is of type [('current directory', [array of folder in current directory], [files in current directory]),('subdirectory', [array of folder in subdirectory], [files in subdirectory]) ....]
arr 을 반복 하고 중간 배열을 인쇄하여 모든 하위 디렉토리 목록을 얻을 수 있습니다.
for i in arr:
for j in i[1]:
print(j)
모든 하위 디렉토리가 인쇄됩니다.
모든 파일을 얻으려면 :
for i in arr:
for j in i[2]:
print(i[0] + "/" + j)
주어진 부모가있는이 함수 directory
는 모든 directories
재귀와 내부에서 발견되는 prints
모든 것을 반복 filenames
합니다. 너무 유용합니다.
import os
def printDirectoryFiles(directory):
for filename in os.listdir(directory):
full_path=os.path.join(directory, filename)
if not os.path.isdir(full_path):
print( full_path + "\n")
def checkFolders(directory):
dir_list = next(os.walk(directory))[1]
#print(dir_list)
for dir in dir_list:
print(dir)
checkFolders(directory +"/"+ dir)
printDirectoryFiles(directory)
main_dir="C:/Users/S0082448/Desktop/carpeta1"
checkFolders(main_dir)
input("Press enter to exit ;")