Python #31 l 파이썬 프로그래밍_하위 디렉터리 검색하기

신승호·2021년 3월 30일
0

Python

목록 보기
32/35
post-custom-banner

List

  • 파이썬 프로그램
    • gugudan
    • 3과 5의배수 합하기
    • 게시판 페이징
    • 간단한 메모장 생성**
    • 탭을 4개의 공백으로 바꾸기
    • 하위 디렉터리 검색하기
    • 파이보
    • 코딩도장

파이썬 프로그래밍_하위 디렉터리 검색하기


하위디렉터리 검색하기

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

1. sub_dir_search.py 파일 작성

  • search 함수를 만들고 시작 디렉터리를 입력받도록 코드를 작성
# sub_dir_search.py

def search(dirname):
    print (dirname)

search("/Users/shinisgood/Desktop/pythonprac")	# 서치할 디렉터리를 넣어준다

2. 파일 검색을 위한 코드 수정

  • 위에서 정해놓은 디렉터리에 있는 파일을 검색할 수 있도록 코드 수정

첨보는 함수

  • os.listdir(디렉터리): 입력된 디렉터리에 있는 파일들의 리스트를 구할 수 있다.
import os
`   
def search(dirname):
    filenames = os.listdir(dirname)
    print (filenames)
`
search("/Users/shinisgood/Desktop/pythonprac")
['.DS_Store', 'sub_dir_search.py', 'memo.py', 'a.txt', 'memo.txt', 'tabto4.py']
  • os.path.join(디렉터리, 파일 이름): 디렉터리파일 이름을 이어주는 함수이며, 디렉터리를 포함한 전체 경로를 쉽게 구할 수 있다.
# 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("/Users/shinisgood/Desktop/pythonprac")
/Users/shinisgood/Desktop/pythonprac/.DS_Store
/Users/shinisgood/Desktop/pythonprac/sub_dir_search.py
/Users/shinisgood/Desktop/pythonprac/memo.py
/Users/shinisgood/Desktop/pythonprac/a.txt
/Users/shinisgood/Desktop/pythonprac/memo.txt
/Users/shinisgood/Desktop/pythonprac/tabto4.py

3. 지정 디렉터리의 특정 파일만을 출력하도록 코드를 변경해 보자

첨보는 함수

  • os.path.splitext(): 파일 이름을 확장자를 기준으로 두 부분으로 나누어 준다
    • '디렉터리 경로와 파일이름' '확장자' 로 나뉜다
# sub_dir_search.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)		# '디렉터리&파일이름' / '확장자' 로 스플릿해라
        print (ext)				
`
search("/Users/shinisgood/Desktop/pythonprac")
('/Users/shinisgood/Desktop/pythonprac/.DS_Store', '')
('/Users/shinisgood/Desktop/pythonprac/sub_dir_search', '.py')
('/Users/shinisgood/Desktop/pythonprac/memo', '.py')
('/Users/shinisgood/Desktop/pythonprac/a', '.txt')
('/Users/shinisgood/Desktop/pythonprac/memo', '.txt')
('/Users/shinisgood/Desktop/pythonprac/tabto4', '.py')
  • '확장자'만 가지고 오기
    • os.path.splitext()[-1] 함수 뒤 [-1] 붙혀라
# sub_dir_search.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]	# 확장자 이름만 가지고 오기 위해서 
        print (ext)				
`
search("/Users/shinisgood/Desktop/pythonprac")
.py
.py
.txt
.txt
.py
  • 디렉터리/Users/shinisgood/Desktop/pythonprac에서 확장자.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': 				# 확장자 중 .py파일만 가지고 오도록 지정
            print(full_filename)			# print(ext)를 입력하면 확장자 이름만 가지고온다.

search("/Users/shinisgood/Desktop/pythonprac`")
/Users/shinisgood/Desktop/pythonprac/sub_dir_search.py
/Users/shinisgood/Desktop/pythonprac/memo.py
/Users/shinisgood/Desktop/pythonprac/tabto4.py

4. 지정 디렉터리의 하위 디렉터리까지 파일 서치할 수 있도록 해보자.

첨보는 함수

  • os.path.isdir(full_filename) : 입력된 값(full_filename)디렉터리인지 파일인지 구별할 수 있게 해준다.
    • 디렉터리가 맞으면 True 출력
>>> import os 
>>> os.path.isdir("/Users/shinisgood/Desktop/pythonprac")
True
  • 디렉터리/Users/shinisgood/Desktop/pythonprac 뿐 아니라 하위 디렉터리(sub directory)까지 파일을 서치할 수 있도록 해보자
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): 			# pythonprac 디렉터리 안에있는 파일은 "디렉터리 경로/파일이름.확장자"으로 출력되기 때문에 False 이다. 하지만 pythonprac안에있는 pythonprac2 디렉터리는 "디렉터리 경로"로만 출력되기 때문에 True이다(왜냐면 뭔 파일이 아니니께).
                search(full_filename) 				# True인 pythonprac2 디렉터리를 다시 서치한다(재귀 호출). 
            else:
                ext = os.path.splitext(full_filename)[-1]	# False 인 pythonprac 디렉터리 안에있는 파일들을 확장자만 표시하고
                if ext == '.py': 				# 확장자 중 ".py"파일 확장자만 가져와서 출력하도록 한다.
                    print(full_filename)
    except PermissionError:
        pass

search("/Users/shinisgood/Desktop/pythonprac`")

try ... except PermissionError를 사용한 이유

  • os.listdir()를 수행할 때 권한이 없는 디렉터리에 접근하더라도 프로그램이 오류로 종료되지 않고 그냥 수행되도록 하기 위해서이다.

Summary

재귀호출 활용 하는걸 잘 이해해야하고, os 함수들을 잘 기억하장

사용된 주요 코드

  • search(디렉터리)
  • os.listdir(디렉터리)
  • os.path.splitext()[-1]
  • os.path.isdir(full_filename)
  • try ... except 오류코드

다른방법으로 하위 디렉터리 검색하기

첨보는 함수

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

import os
`
for (path, dir, files) in os.walk("/Users/shinisgood/Desktop/pythonprac"):
    print("%s/%s/%s" % (path, dir,files))
/Users/shinisgood/Desktop/pythonprac/['pythonprac2']/['.DS_Store', 'sub_dir_search.py', 'memo.py', 'a.txt', 'memo.txt']
/Users/shinisgood/Desktop/pythonprac/pythonprac2/[]/['.DS_Store', 'tabto4.py']
import os

for (path, dir, files) in os.walk("/Users/shinisgood/Desktop/pythonprac/pythonprac2"):
    for filename in files:			# pythonprac과 하위폴더 내 모든파일의 이름을 하나씩 불러오자
        ext = os.path.splitext(filename)[-1]	# 파일 이름과 확장자로 나누자
        if ext == '.py':
            print("%s/%s" % (path, filename))	# ".py"인 파일을 "경로/파일이름"으로 출력

참고

  • path : 현재 디렉터리 경로
  • dir : 현재 디렉터리 내 폴더(디렉터리)
  • files: 파일명
profile
신승홉니다
post-custom-banner

0개의 댓글