wake-up-neo.com

Python의 디렉토리 트리 목록

파이썬에서 주어진 디렉토리에있는 모든 파일 (및 디렉토리)의 목록을 얻으려면 어떻게해야합니까?

537
Matt

이것은 디렉토리 트리의 모든 파일과 디렉토리를 탐색하는 방법입니다.

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')
596
Jerub

당신이 사용할 수있는

os.listdir(path)

참조 및 기타 함수에 대한 자세한 내용은 다음을 참조하십시오.

517
rslite

다음은 내가 자주 사용하는 도우미 함수입니다.

import os

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

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

Globbing 능력이 필요한 경우, 그 모듈도 있습니다. 예 :

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

다음과 같이 반환 할 것입니다 :

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

here 문서를 참조하십시오.

12
kenny

이 시도:

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

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

파이썬 2.7 :

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

파이썬 3.x :

import os
os.listdir()

Stam Kaly에게 감사의 말을 전합니다. python 3.x

7
Dave Engineer

재귀 적 구현

import os

def scan_dir(dir):
    for name in os.listdir(dir):
        path = os.path.join(dir, name)
        if os.path.isfile(path):
            print path
        else:
            scan_dir(path)

필자는 필요할 수있는 모든 옵션이 포함 된 긴 버전을 작성했습니다. 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 __== "__main__":
    test(*sys.argv[1:])
2
Sam Watkins

파이썬 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
Alejandro Blasco

파일 만 재귀 적으로 나열하는 좋은 라이너. 내 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
fivetentaylor

한 줄 Python 버전입니다 :

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

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

1
salehinejad
#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 __== '__main__':
    main()
0
Alok

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

트리에 conf 파일 목록을 원한다면 = 1K :

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'),
0
Steve Tarver

여기 또 다른 옵션이 있습니다.

os.scandir(path='.')

Path에 지정된 디렉토리에있는 항목 (파일 속성 정보와 함께)에 해당하는 os.DirEntry 객체의 반복자를 반환합니다.

예:

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

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

파이썬 문서

0
Khaino

저와 함께 일하는 사람은 Saleh의 대답에서 수정 된 버전입니다.

코드는 다음과 같습니다.

"dir = 'given_directory_name'os.listdir (dir)에서 i에 대해 filenames = [os.path.abspath (os.path.join (dir, i))]"

0
HassanSh__3571619
import os, sys

#open files in directory

path = "My Documents"
dirs = os.listdir( path )

# print the files in given directory

for file in dirs:
   print (file)
0
Kevin

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

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

내가 이걸 던져 넣을 것 같으면 와일드 카드 검색을하는 단순하고 더러운 방법.

import re
import os

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

FYI 확장 또는 ext 파일 필터 추가 import 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
moylop260

나는 이것이 오래된 질문이라는 것을 알고있다. 이것은 당신이 liunx 기계에 있다면 나는 건너 왔어 깔끔한 방법입니다.

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