본문 바로가기
프로그래밍/Python

파이썬(Python) 파일과 폴더(디렉토리) 탐색하기 (feat. glob)

by 부자 꽁냥이 2023. 4. 23.

파이썬(Python)의 내장 모듈인 glob을 이용하면 파일명의 패턴을 이용하여 특정 폴더와 그 하위에 있는 파일을 찾아낼 수 있다. 이번 포스팅에서는 glob 모듈을 이용하여 특정 패턴을 갖는 파일과 폴더를 탐색하는 방법에 대해서 알아보고자 한다.


   glob 사용법

여기서는 많이 사용되는 조건을 바탕으로 glob 사용법을 알아본다.


1) 현재 디렉토리 내 폴더와 파일 확인하기

a. 현재 디렉토리에 있는 폴더만 확인 : **/, */

아래 코드는 현재 폴더 내 모든 폴더를 출력한다.

## 현재 폴더 내 모든 폴더
for folder_name in glob.glob('**/'): ## 또는 glob.glob(*/)
    print(folder_name)

 

b. 현재 폴더 내 폴더와 파일까지 확인 : **, *

와일드카드 '*' 또는 '**'를 사용하면 현재 폴더의 폴더와 파일 모두 확인할 수 있다.

 

## 현재 폴더 내 모든 폴더와 파일
for f in glob.glob('**'): ## 또는 glob.glob(*)
    print(f)

 

c. 현재 폴더의 파일만 탐색하기

참고로 현재 폴더의 파일만 탐색하고 싶다면 glob 자체만으로는 하기 어렵고 os.path.isfile 함수를 이용하면 쉽게 할 수 있다. glob을 이용하여 모든 폴더와 파일 리스트를 뽑은 다음 os.path.isfile을 이용하여 파일만 빼내면 된다.

 

## 현재 폴더의 파일만 갖고 오기
import os
all_folder = glob.glob('*') ## 또는 glob.glob('**')
all_file = [x for x in all_folder if os.path.isfile(x)]
for file_name in all_file:
    print(file_name)

 

d. 하위 폴더에 있는 폴더와 파일 가져오기

아래 코드는 현재 폴더는 제외하고 현재 폴더의 모든 하위 폴더에 있는 폴더와 파일을 출력한다.

 

## 현재 폴더의 하위에 있는 폴더와 파일(현재 폴더는 포함 안됨)
for f in glob.glob('*/*'): ## 또는 **/**, **/*, */**
    print(f)

 

이번엔 현재 폴더를 포함하여 하위 폴더의 폴더와 파일명을 모두 가져와 본다. 이때에 glob의 recursive=True로 설정한다. 만약 폴더와 파일이 많은 경우 성능 부하가 생길 수 있으니 조심하자. 아래 코드는 500개까지만 출력한다.

 

## 현재 폴더의 하위에 있는 폴더와 파일(현재 폴더는 포함)
for i, f in enumerate(glob.glob('**', recursive=True)):
    print(f)

 


'**'와 '*'의 차이

 

와일드카드 '**'와 '*'은 원래는 차이가 없지만 glob에서 recursive=True인 경우에 차이가 난다. '*'는 recursive 탐색이 안되면 '**'은 recursive 탐색이 가능하다는 차이가 있다. 아래 코드는 recursive=True인 상황에서 '**'와 '*'의 동작 방식을 3가지로 나눈 것이다. 이에 대한 설명은 주석을 참고하자.

 

glob.glob('*/*', recursive=True) ## 현재 폴더의 하위 폴더들 속에 있는 폴더와 파일(현재 폴더 포함 X)
glob.glob('*/**', recursive=True) ## 현재 폴더의 모든 하위 폴더와 파일(현재 폴더 포함 X)
glob.glob('**', recursive=True) ## 현재 폴더와 모든 하위 폴더 그리고 파일(현재 폴더 포함 O) ** 대신 **/*을 해도 됨.

2) 특정 확장자 찾기

a. 특정 확장자 찾기

와일드 카드 '*'를 이용하여 test_folder 내에 있는 텍스트 파일을 검색한다.

 

## test_folder에 텍스트 파일(바로 아래 단계까지만 검색 된다.)
for file_name in glob.glob('test_folder/*.txt'):
    print(file_name)

 

만약 test_folder 내 하위 폴더를 포함한 모든 텍스트 파일을 검색하고자 한다면 다음과 같이 한다.

 

## test_folder와 하위 폴더에 포함된 모든 텍스트 파일
for file_name in glob.glob('test_folder/**/*.txt', recursive=True):
    print(file_name)

 

b. 둘 이상 확장자 찾기

만약 test_folder 속에 txt와 bmp 파일 모두 찾고자 한다면 아래와 같이 한다.

 

## test_folder와 하위 폴더에 포함된 모든 텍스트 파일
types = ['test_folder/*.txt', 'test_folder/*.bmp']
all_f = []
for t in types:
    all_f.extend(glob.glob(t))

for file_name in all_f:
    print(file_name)

 


3) 파일명 패턴으로 찾기

a. 특정 문자열로 시작하거나 끝나는 파일 찾기

특정 문자 뒤에 '*'을 붙이면 해당 문자로 시작하는 파일을 찾을 수 있다. 아래 코드는 test_folrder 내 test로 시작하는 텍스트 파일을 출력한다.

 

## test_folder에서 test로 시작하는 텍스트 파일 출력
start_str = 'test'
for f in glob.glob(f'test_folder/{start_str}*.txt'):
    print(f)

 

 

반대로 특정 문자로 끝나는 파일을 찾고 싶다면 '*' 뒤에 해당 문자를 붙여주면 된다.

 

## test_folder에서 test로 끝나는 텍스트 파일 출력
end_str = 'test'
for f in glob.glob(f'test_folder/*{end_str}.txt'):
    print(f)

 

 

b. 특정 문자열을 포함하는 파일 찾기

'*' 사이에 찾고자 하는 문자열을 넣어주면 해당 문자열을 포함하는 파일을 찾을 수 있다.

 

## test_folder에서 test를 포함하는 텍스트 파일 출력
target_str = 'test'
for f in glob.glob(f'test_folder/*{target_str}*.txt'):
    print(f)

 

 

c. 파일명 문자 개수로 찾기

와일드카드 '?'는 문자 하나를 의미하므로 원하는 파일명의 문자 개수만큼 '?'을 붙여주면 원하는 파일을 찾을 수 있다.

 

## test_folder에서 문자가 6개인 파일명을 가진 텍스트 파일 출력
for f in glob.glob('test_folder/??????.txt'):
    print(f)

 


댓글


맨 위로