파이썬의 디렉토리 트리 목록


답변:


615

이것은 디렉토리 트리에서 모든 파일과 디렉토리를 순회하는 방법입니다.

import os

for dirname, dirnames, filenames in os.walk('.'):
    # print path to all subdirectories first.
    for subdirname in dirnames:
        print(os.path.join(dirname, subdirname))

    # print path to all filenames.
    for filename in filenames:
        print(os.path.join(dirname, filename))

    # Advanced usage:
    # editing the 'dirnames' list will stop os.walk() from recursing into there.
    if '.git' in dirnames:
        # don't go into any .git directories.
        dirnames.remove('.git')

19
그리고 파이썬 셸에서이 코드를있는 그대로 실행하면 Ctrl + C는 해당 셸에 대한 출력을 중단합니다. ;)
gary

41
이것은 재귀 적으로 파일과 디렉토리를 나열 할 것입니다
rds

디렉토리 이름 목록을 편집하여 일부 경로가 반복되지 않도록 할 수도 있습니다.
bugloaf

8
@ Clément "topdown이 True 인 경우 호출자는 dirnames 목록을 제자리에서 수정할 수 있으며 (아마도 del 또는 slice 할당을 사용하여) walk ()는 이름이 dirname에 남아있는 서브 디렉토리로만 되풀이됩니다. 검색, 특정 방문 순서를 부과하거나 호출자가 walk ()를 다시 시작하기 전에 작성하거나 이름을 바꾼 디렉토리에 대해 walk ()에 알리기까지합니다. " 에서 docs.python.org/2/library/os.html#os.walk
bugloaf

일부 디렉토리를 무시하는 가장 간단한 방법은 처음에 디렉토리에 디렉토리를 추가하지 않는 것입니다.for subdirname in dirnames: if subdirname != '.git'
smci

537

당신이 사용할 수있는

os.listdir(path)

참조 및 더 많은 os 함수는 다음을 참조하십시오.


1
원래의 질문은 그들이 재귀 솔루션을 원했는지 여부를 알 수 없을 정도로 모호합니다. "디렉토리의 모든 파일"은 재귀로 해석 될 수 있습니다.
Tommy

3
@Tommy에서 "디렉토리"는 명확하게 정의 된 데이터 구조이며 "ls -R"이 아닌 "ls"를 나타냅니다. 또한, 거의 모든 UNIX 도구는 기본적으로 재귀 적으로 작동하지 않습니다. 나는 질문자 무엇을 의미 하는지 모르지만 그가 쓴 내용 은 분명했다.
Torsten Bronger

python 3 문서는 os.scandir대신 사용하도록 지시합니다 . 많은 경우 시스템 호출을 방지하여 무료 속도를 제공 할 수 있습니다 (IPC 및 IO 모두 느림).
Jappie Kerk

5
listdir은 디렉토리의 유일한 파일 이름을 제공합니다. 전체 경로를 얻는 방법이 있습니까?
greperror

1
@greperror 전체 경로를 얻기 위해 os.path.abspath 를 사용할 수 있습니다 . 또한 주어진 경로가 파일인지 확인하려면 os.path.isfile 또는을 사용하십시오 os.path.isdir.
Aleksandar

111

내가 자주 사용하는 도우미 함수는 다음과 같습니다.

import os

def listdir_fullpath(d):
    return [os.path.join(d, f) for f in os.listdir(d)]

3
발전기가 더 좋습니다.
Robert Siemer

1
사용법에 따라 @RobertSiemer 많은 경우 목록이 더 나을 것이지만 목록으로 변환 할 수 있기 때문에 생성기가 더 다재다능하다고 생각합니다. 그것은 당신이 찾고있는 다양성, 또는 좀 더 간소화 된 것에 달려 있습니다.
James Mchugh

3
10 년이 지났지 만 os.listdir ()이 목록을 반환하고 그것을 모방했기 때문에 이런 식으로했다고 생각합니다.
giltay

82
import os

for filename in os.listdir("C:\\temp"):
    print  filename

16
r'C:\temp'"C:\\temp"백스 트래시 를 제거 하는 것보다 Rawstring 이 더 좋습니다 .
smci

13

글 로빙 능력이 필요한 경우이를위한 모듈도 있습니다. 예를 들면 다음과 같습니다.

import glob
glob.glob('./[0-9].*')

다음과 같은 것을 반환합니다 :

['./1.gif', './2.txt']

여기 에서 설명서를 참조 하십시오 .


10

이 시도:

import os
for top, dirs, files in os.walk('./'):
    for nm in files:       
        print os.path.join(top, nm)

한 줄에 : [top + os.sep + f는 top, dirs, os.walk ( './')에있는 파일은 f에 대해 파일]
J. Peterson

9

경로를 지정하지 않고 현재 작업 디렉토리에있는 파일의 경우

파이썬 2.7 :

import os
os.listdir(os.getcwd())

파이썬 3.x :

import os
os.listdir()

Python 3.x에 대한 의견을 주신 Stam Kaly에게 감사드립니다.


5
os.listdir()기본적으로 현재 디렉토리의 요소를 나열합니다! 에 대한 필요가 없습니다 그래서 os.getcwd():
스탐 Kaly

어떻게해야합니까? 내가 인수없이 () >>> os.listdir를 사용할 때 내가 얻을 : 형식 오류가 :은 listDir ()가 정확히한다 (주어진 0) 1 개 인자
데이브 엔지니어

2
2.7에서 실행 중이라고 가정합니다. 이것은 3.x
Stam Kaly


3

필요한 모든 옵션을 갖춘 긴 버전을 작성했습니다. http://sam.nipl.net/code/python/find.py

나는 그것이 여기에도 맞을 것이라고 생각한다.

#!/usr/bin/env python

import os
import sys

def ls(dir, hidden=False, relative=True):
    nodes = []
    for nm in os.listdir(dir):
        if not hidden and nm.startswith('.'):
            continue
        if not relative:
            nm = os.path.join(dir, nm)
        nodes.append(nm)
    nodes.sort()
    return nodes

def find(root, files=True, dirs=False, hidden=False, relative=True, topdown=True):
    root = os.path.join(root, '')  # add slash if not there
    for parent, ldirs, lfiles in os.walk(root, topdown=topdown):
        if relative:
            parent = parent[len(root):]
        if dirs and parent:
            yield os.path.join(parent, '')
        if not hidden:
            lfiles   = [nm for nm in lfiles if not nm.startswith('.')]
            ldirs[:] = [nm for nm in ldirs  if not nm.startswith('.')]  # in place
        if files:
            lfiles.sort()
            for nm in lfiles:
                nm = os.path.join(parent, nm)
                yield nm

def test(root):
    print "* directory listing, with hidden files:"
    print ls(root, hidden=True)
    print
    print "* recursive listing, with dirs, but no hidden files:"
    for f in find(root, dirs=True):
        print f
    print

if __name__ == "__main__":
    test(*sys.argv[1:])

3

다른 옵션이 있습니다.

os.scandir(path='.')

경로로 지정된 디렉토리의 항목 (파일 속성 정보와 함께)에 해당하는 os.DirEntry 오브젝트의 반복자를 리턴합니다.

예:

with os.scandir(path) as it:
    for entry in it:
        if not entry.name.startswith('.'):
            print(entry.name)

os.DirEntry 객체는 디렉토리를 스캔 할 때 운영 체제에서 정보를 제공하는 경우 os.DirEntry 객체가이 정보를 노출하므로 listdir () 대신 scandir ()을 사용하면 파일 유형 또는 파일 속성 정보가 필요한 코드의 성능이 크게 향상 될 수 있습니다 . 모든 os.DirEntry 메소드는 시스템 호출을 수행 할 수 있지만 is_dir () 및 is_file ()은 일반적으로 기호 링크에 대한 시스템 호출 만 필요합니다. os.DirEntry.stat ()는 항상 Unix에서 시스템 호출이 필요하지만 Windows에서는 기호 링크에 대한 호출 만 필요합니다.

파이썬 문서


3

하지만 os.listdir()파일 및 디렉토리 이름의 목록을 생성하는 좋은이며, 자주 당신은 당신이 그 이름을 한 번 더하고 싶어 - 그리고 Python3에, pathlib는 그 다른 집안일을 간단하게 해줍니다. 한번 보시고 내가 좋아하는만큼 보도록합시다.

dir 내용을 나열하려면 Path 객체를 구성하고 반복자를 가져옵니다.

In [16]: Path('/etc').iterdir()
Out[16]: <generator object Path.iterdir at 0x110853fc0>

사물의 이름 목록 만 원하는 경우 :

In [17]: [x.name for x in Path('/etc').iterdir()]
Out[17]:
['emond.d',
 'ntp-restrict.conf',
 'periodic',

당신이 단지 dirs를 원한다면 :

In [18]: [x.name for x in Path('/etc').iterdir() if x.is_dir()]
Out[18]:
['emond.d',
 'periodic',
 'mach_init.d',

해당 트리에있는 모든 conf 파일의 이름을 원할 경우 :

In [20]: [x.name for x in Path('/etc').glob('**/*.conf')]
Out[20]:
['ntp-restrict.conf',
 'dnsextd.conf',
 'syslog.conf',

트리> = 1K에서 conf 파일 목록을 원하는 경우 :

In [23]: [x.name for x in Path('/etc').glob('**/*.conf') if x.stat().st_size > 1024]
Out[23]:
['dnsextd.conf',
 'pf.conf',
 'autofs.conf',

상대 경로 해결이 쉬워집니다.

In [32]: Path('../Operational Metrics.md').resolve()
Out[32]: PosixPath('/Users/starver/code/xxxx/Operational Metrics.md')

경로로 탐색하는 것은 매우 분명합니다 (예기치 않지만).

In [10]: p = Path('.')

In [11]: core = p / 'web' / 'core'

In [13]: [x for x in core.iterdir() if x.is_file()]
Out[13]:
[PosixPath('web/core/metrics.py'),
 PosixPath('web/core/services.py'),
 PosixPath('web/core/querysets.py'),

1

파일 만 재귀 적으로 나열하는 멋진 라이너. 내 setup.py package_data 지시문에서 이것을 사용했습니다.

import os

[os.path.join(x[0],y) for x in os.walk('<some_directory>') for y in x[2]]

나는 그것이 질문에 대한 대답이 아니라는 것을 알고 있지만 유용 할 수 있습니다.


1

파이썬 2

#!/bin/python2

import os

def scan_dir(path):
    print map(os.path.abspath, os.listdir(pwd))

파이썬 3

필터 및 맵의 경우 list ()로 랩핑해야합니다.

#!/bin/python3

import os

def scan_dir(path):
    print(list(map(os.path.abspath, os.listdir(pwd))))

권장 사항은 맵 및 필터 사용법을 생성기 표현식 또는 목록 이해로 대체하는 것입니다.

#!/bin/python

import os

def scan_dir(path):
    print([os.path.abspath(f) for f in os.listdir(path)])

1

다음은 한 줄의 Pythonic 버전입니다.

import os
dir = 'given_directory_name'
filenames = [os.path.join(os.path.dirname(os.path.abspath(__file__)),dir,i) for i in os.listdir(dir)]

이 코드는 주어진 디렉토리 이름에있는 모든 파일과 디렉토리의 전체 경로를 나열합니다.


감사 Saleh,하지만 코드가 완전히 작동하지 않았고 작동 한 코드는 다음과 같이 수정되었습니다 : 'dir ='given_directory_name 'filenames = [os.path.abspath (os.path.join (dir, i)) i os.listdir (dir)] '
HassanSh__3571619

1

나는 이것이 오래된 질문이라는 것을 안다. liunx 머신을 사용하는 경우이 방법이 깔끔하게 나타납니다.

import subprocess
print(subprocess.check_output(["ls", "/"]).decode("utf8"))

0
#import modules
import os

_CURRENT_DIR = '.'


def rec_tree_traverse(curr_dir, indent):
    "recurcive function to traverse the directory"
    #print "[traverse_tree]"

    try :
        dfList = [os.path.join(curr_dir, f_or_d) for f_or_d in os.listdir(curr_dir)]
    except:
        print "wrong path name/directory name"
        return

    for file_or_dir in dfList:

        if os.path.isdir(file_or_dir):
            #print "dir  : ",
            print indent, file_or_dir,"\\"
            rec_tree_traverse(file_or_dir, indent*2)

        if os.path.isfile(file_or_dir):
            #print "file : ",
            print indent, file_or_dir

    #end if for loop
#end of traverse_tree()

def main():

    base_dir = _CURRENT_DIR

    rec_tree_traverse(base_dir," ")

    raw_input("enter any key to exit....")
#end of main()


if __name__ == '__main__':
    main()

5
이 질문은 이미 완벽하게 좋은 답을 가지고 있습니다. 다시 대답 할 필요가 없습니다
Mike Pennington

0

참고 확장 또는 ext 파일 가져 오기 os 필터 추가

path = '.'
for dirname, dirnames, filenames in os.walk(path):
    # print path to all filenames with extension py.
    for filename in filenames:
        fname_path = os.path.join(dirname, filename)
        fext = os.path.splitext(fname_path)[1]
        if fext == '.py':
            print fname_path
        else:
            continue

0

생각 나면 이것을 넣을 것입니다. 와일드 카드 검색을 수행하는 간단하고 더러운 방법.

import re
import os

[a for a in os.listdir(".") if re.search("^.*\.py$",a)]

0

아래 코드는 디렉토리 내의 디렉토리와 파일을 나열합니다

def print_directory_contents(sPath):
        import os                                       
        for sChild in os.listdir(sPath):                
            sChildPath = os.path.join(sPath,sChild)
            if os.path.isdir(sChildPath):
                print_directory_contents(sChildPath)
            else:
                print(sChildPath)

0

나와 함께 일한 것은 위의 Saleh 답변에서 수정 된 버전입니다.

코드는 다음과 같습니다.

"dir = 'given_directory_name'파일 이름 = [os.listdir (dir)의 i에 대한 os.path.abspath (os.path.join (dir, i))]"

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