TIL - python(연습문제) # 하위 디렉토리 검색

한성봉·2021년 4월 27일
0

이 글은 도서 '점프 투 파이썬' 연습문제를 토대로 작성하였습니다.

하위 디렉토리 검색하기

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

1. 파일 작성

에디터에 sub_dir_search.py파일을 작성해보자.
우선 sub_dir_search.py 는 작업하고 싶은 환경(디렉토리)에 저장한다.
나는 /Users/ssaboo/Desktop/project/pythonWorkspace 경로에 pythonWorkspace라는 디렉토리에 저장하겠다. 코드를 작성하여보자.

def search(dirname):
    print(dirname)
    
search("/Users/ssaboo/Desktop/project/pythonWorkspace")

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

2. 파일 검색 코드 작성

import os

def search(dirname):
    filenames = os.listdir(dirname)
    for filename in filenames:
        full_filename = os.path.join(dirname, filename)
        print(full_filename)
    
search("/Users/ssaboo/Desktop/project/pythonWorkspace")

os.listdir을 사용하면 해당 디렉터리에 있는 파일들의 리스트를 구할 수 있다. os모듈에는 디렉터리와 파일 이름을 이어 주는 os.path.join함수가 있으므로 이 함수를 이용하면 디렉터리를 포함한 전체 경로를 쉽게 구할 수 있다. 코드를 실행하면 터미널에 다음과 같은 화면이 출력된다.

/Library/Frameworks/Python.framework/Versions/3.9/bin/python3 /Users/ssaboo/Desktop/project/pythonWorkspace/sub_dir_search.py
/Users/ssaboo/Desktop/project/pythonWorkspace/.DS_Store
/Users/ssaboo/Desktop/project/pythonWorkspace/sub_dir_search.py
/Users/ssaboo/Desktop/project/pythonWorkspace/memo.py
/Users/ssaboo/Desktop/project/pythonWorkspace/practice.py
/Users/ssaboo/Desktop/project/pythonWorkspace/b.txt
/Users/ssaboo/Desktop/project/pythonWorkspace/a.txt
/Users/ssaboo/Desktop/project/pythonWorkspace/memo.txt
/Users/ssaboo/Desktop/project/pythonWorkspace/.vscode
/Users/ssaboo/Desktop/project/pythonWorkspace/tabto4.py

search함수로 검색하고자 했던 디렉터리안의 파일 목록들을 확인할 수 있다.

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("/Users/ssaboo/Desktop/project/pythonWorkspace")

os.path.splitext 는 확장자만 추출하는 함수이다. 이 함수는 파일 이름을 확장자를 기준으로 두 부분으로 나누어 준다. 따라서 os.path.splitext(full_filename)[-1] 은 해당 파일의 확장자 이름이 된다. 확장자가 .py인 파일만 출력하도록 코드를 작성하였는데 실행하여 확인하여보자.

내가 확인하고 싶은 디렉터리의 파일 목록들이다. 잘 출력되는지 확인하여보자.

/Users/ssaboo/Desktop/project/pythonWorkspace/sub_dir_search.py
/Users/ssaboo/Desktop/project/pythonWorkspace/memo.py
/Users/ssaboo/Desktop/project/pythonWorkspace/practice.py
/Users/ssaboo/Desktop/project/pythonWorkspace/tabto4.py

코드를 실행하면 해당 디렉터리안의 확장자가 .py인 파일만 잘 출력된 것을 확인할 수 있다.

4. 하위 디렉터리의 파일 검색

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("/Users/ssaboo/Desktop/project/pythonWorkspace")

try ... except PermissionError 로 감싼 이유는 os.listdir를 수행할 때 권한이 없는 디렉터리에 접근하더라도 오류로 종료되지 않고 그냥 수행되도록 하기 위해서이다.
os.path.isdirfull_filename이 디렉터리인지 파일인지 구분하기 위한 함수이다. 디렉터리일 경우 해당 경로를 입력받아 search함수를 호출한다. 해당 디렉터리의 파일이 디렉터리일 경우 다시 search함수를 호출해 나가면 해당 디렉터리의 하위 파일을 다시 검색하기 시작하므로 결국 모든 파일들을 검색할 수 있게 된다.
search함수에서 다시 자기 자신인 search 함수를 호출하는 재귀호출이 사용된다.
재귀호출 : 자기 자신을 다시 호출하는 프로그래밍 기법이다.
코드를 실행하여보자.

하위 디렉터리를 잘 검색하는지 확인하기 위해 pythonWorkspace 하위에 ex1이라는 디렉터리를 생성하고 안에 다양한 확장자의 파일들을 생성했놓았다. 코드를 실행해보자.

/Users/ssaboo/Desktop/project/pythonWorkspace/sub_dir_search.py
/Users/ssaboo/Desktop/project/pythonWorkspace/memo.py
/Users/ssaboo/Desktop/project/pythonWorkspace/ex1/ex3.py
/Users/ssaboo/Desktop/project/pythonWorkspace/ex1/ex1.py
/Users/ssaboo/Desktop/project/pythonWorkspace/practice.py
/Users/ssaboo/Desktop/project/pythonWorkspace/tabto4.py

해당 디렉터리부터 하위 디렉터리까지 원하는 확장자(.py)만 잘 출력된 것을 확인 할 수 있다.

5. os.walk

하위 디렉터리를 쉽게 검색해주는 방법을 살펴보자 os.walk 를 사용하면 위에 작성한 코드보다 간편하게 만들수 있다.
os.walk 는 시작 디렉터리부터 시작하여 하위 모든 디렉터리를 차례대로 방문하게 해주는 함수이다.

import os

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

코드를 실행하여보자

/Users/ssaboo/Desktop/project/pythonWorkspace/sub_dir_search.py
/Users/ssaboo/Desktop/project/pythonWorkspace/memo.py
/Users/ssaboo/Desktop/project/pythonWorkspace/practice.py
/Users/ssaboo/Desktop/project/pythonWorkspace/tabto4.py
/Users/ssaboo/Desktop/project/pythonWorkspace/ex1/ex3.py
/Users/ssaboo/Desktop/project/pythonWorkspace/ex1/ex1.py

코드를 실행하면 위와 같은 결과를 확인할 수 있다.

0개의 댓글