본문 바로가기
강의/점프투파이썬

[점프투파이썬] 5. 하위 디렉터리 검색하기(os.listdir/os.path.join/splitext/isdir/os.walk)

by 소꿍 2020. 3. 17.

5. 특정 디렉터리부터 시작해서 그 하위 모든 파일 중 파이썬 파일(*.py)만 출력해 주는 프로그램을 만들어 보자.

 

- 내 답안

 

디렉터리 안의 모든 파일을 읽어서 리스트로 만들어 주는 glob을 활용한다.

1) glob 코드를 넣은 모듈을 만든다.("practice6_6.py")

import glob
glob.glob("C:/doit/*.py")

 

2) 다음 명령을 통해 실행한다.

C:/doit>python practice6_6.py

 

*여기서 뭐가 더 있을텐데 뭘 더 해야 하는지 잘 모르겠고, 코드 실행도 안 됨..!

이 문제 아예 못 푼 듯ㅠ


- 해설

 

1) sub_dir_search.py 파일을 작성한다.

# C:/doit/sub_dir_search.py
def search(dirname):
	print (dirname)
    
search("c:/")

search 함수를 만들고 시작 디렉터리를 입력받도록 코드를 작성했다.

 

2) 이 디렉터리에 있는 파일을 검색할 수 있도록 소스를 변경한다.

# C:/doit/sub_dir_search.py
import os

def search(dirname):
    filenames = os.listdir(dirname)
    for filename in filenames:
        full_filename = os.path.join(dirname, filename)
        print(full_filename)

search("C:/")

os.listdir를 사용하면 해당 디렉터리에 있는 파일들의 리스트를 구할 수 있다.(파일 이름의 리스트)

경로를 포함한 파일 이름을 구하기 위해서는 입력으로 받은 dirname을 앞에 덧붙여 주어야 한다.

os 모듈에는 디렉터리와 파일 이름을 이어 주는 os.path.join 함수가 있으므로, 이 함수를 사용하면 디렉터리를 포함한 전체 경로를 쉽게 구할 수 있다.

위 코드를 수행하면 C:/ 디렉터리에 있는 파일이 출력된다.

 

c:/$Recycle.Bin
c:/$WINDOWS.~BT
c:/$Windows.~WS
c:/adb
c:/AMD
c:/android
c:/bootmgr
c:/BOOTNXT
… 생략 …

 

3) 디렉터리의 파일 중 확장자가 .py인 파일만을 출력하도록 코드를 변경한다.

import os

def search(dirname):
    filenames = os.listdir(dirname)
    for filename in filenames:
        full_filename = os.path.join(dirname, filename)
        ext = os.path.splitext(full_filename)[-1]
        if ext == '.py':
            print(full_filename)

search("C:/")

파일 이름에서 확장자만 추출하기 위해 os 모듈의 os.path.splitext 함수를 사용하였다.

os.path.splitext는 파일 이름을 확장자를 기준으로 두 부분으로 나누어 준다.

따라서 os.path.splitext(full_filename)[-1]은 해당 파일의 확장자 이름이 된다.

 

4) C:/ 디텍터리뿐만 아니라 하위 디렉터리도 검색이 가능하도록 다음과 같이 코드를 변경한다.

import os

def search(dirname):
    try:
        filenames = os.listdir(dirname)
        for filename in filenames:
            full_filename = os.path.join(dirname, filename)
            if os.path.isdir(full_filename):
                search(full_filename)
            else:                
                ext = os.path.splitext(full_filename)[-1]
                if ext == '.py':
                    print(full_filename)
	except PermissionError:
    	pass

search("C:/")

try ... except PermissionError로 함수 전체를 감싼 이유는 os.listdir를 수행할 때 권한이 없는 디렉터리에 접근하더라도 프로그램이 오류로 종료되지 않고 그냥 수행되도록 하기 위해서이다.

full_filename이 디렉터리인지 파일인지 구별하기 위하여 os.path.isdir 함수를 사용하였고,

디렉터리일 경우 해당 경로를 입력받아 다시 search 함수를 호출하였다.

이렇게 해당 디렉터리의 파일이 디렉터리일 경우 다시 search 함수를 호출해 나가면(*재귀 호출)

해당 디렉터리의 하위 파일을 다시 검색하기 시작하므로 결국 모든 파일들을 검색할 수 있게 된다.

※ 재귀 호출이란 자기 자신을 다시 호출하는 프로그래밍 기법이다.
이 코드에서는 search 함수에서 다시 자기 자신인 search 함수를 호출하는 것이 바로 재귀 호출이다.

위 코드를 수행하면 C:/디렉터리에 있는 모든 파이썬 파일이 출력될 것이다.

 

*모르는 게 아주 많이 나왔다.... 다시 복습해야징

 

 

+ [하위 디렉터리 검색을 쉽게 해주는 os.walk]

os.walk는 시작 디렉터리부터 시작하여 그 하위 모든 디렉터리를 차례대로 방문하게 해주는 함수

import os

for (path, dir, files) in os.walk("c:/"):
    for filename in files:
        ext = os.path.splitext(filename)[-1]
        if ext == '.py':
            print("%s/%s" % (path, filename))

디렉터리와 파일을 검색하는 일반적인 경우라면 os.walk를 사용하기

댓글