Programing

Python의 디렉토리 트리 목록

lottogame 2020. 10. 4. 10:14
반응형

Python의 디렉토리 트리 목록


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


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

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

당신이 사용할 수있는

os.listdir(path)

참조 및 기타 OS 기능은 여기를 참조하십시오.


자주 사용하는 도우미 기능은 다음과 같습니다.

import os

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

import os

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

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

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

다음과 같은 결과를 반환합니다.

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

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


이 시도:

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

경로를 지정하지 않은 현재 작업 디렉토리의 파일

Python 2.7 :

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

Python 3.x :

import os
os.listdir()

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


재귀 적 구현

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 __name__ == "__main__":
    test(*sys.argv[1:])

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

os.scandir(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의 심볼릭 링크에는 하나만 필요합니다.

Python 문서


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

import os

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

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


Python 2의 경우

#!/bin/python2

import os

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

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

다음은 한 줄 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)]

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


os.listdir()파일 및 dir 이름 목록을 생성 하는 것은 좋지만 이러한 이름이 있으면 더 많은 작업을 수행하고 싶을 때가 많습니다. Python3에서 pathlib 는 다른 작업을 간단하게 만듭니다. 당신이 나만큼 좋아하는지 살펴 보자.

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

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

If we want just a list of names of things:

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

If you want just the dirs:

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

If you want the names of all conf files in that tree:

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

If you want a list of conf files in the tree >= 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',

Resolving relative paths become easy:

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

Navigating with a Path is pretty clear (although unexpected):

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

#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()

FYI Add a filter of extension or ext file 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

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)

If figured I'd throw this in. Simple and dirty way to do wildcard searches.

import re
import os

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

Below code will list directories and the files within the dir

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)

I know this is an old question. This is a neat way I came across if you are on a liunx machine.

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

The one worked with me is kind of a modified version from Saleh answer above.

The code is as follows:

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

참고URL : https://stackoverflow.com/questions/120656/directory-tree-listing-in-python

반응형