Python 하위폴더 파일이름 취득 pathlib glob iterdir 사용 방법

파이썬 pathlib 모듈을 사용해 폴더 안에 있는 파일과 하위 폴더에 있는 파일 일람을 취득하는 방법을 알아보겠습니다.

재귀 처리를 하거나 와일드카드 문자, 정규 표현식 등 조건을 지정해서 파일 이름을 취득할 수 있습니다.

폴더와 파일 하위 폴더 구성은 아래처럼 되어있다는 가정하에 샘플 소스를 만들겠습니다.

temp
├── 1.txt
├── 12.text
├── 123.txt
├── [x].txt
├── aaa.text
└── dir
    ├── 987.text
    ├── bbb.txt
    ├── sub_dir1
    │   ├── 98.txt
    │   └── ccc.text
    └── sub_dir2
        └── ddd.text

 

iterdir() 메서드

Path 오브젝트의 iterdir() 메서드를 사용해 지정한 폴더 안에 있는 파일과 하위 디렉토리를 취득하는 예제를 보겠습니다.

import pathlib
import re
import pprint

p_temp = pathlib.Path('temp')

print(type(p_temp.iterdir()))
# <class 'generator'>

pprint.pprint(list(p_temp.iterdir()))
# [PosixPath('temp/[x].txt'),
#  PosixPath('temp/aaa.text'),
#  PosixPath('temp/dir'),
#  PosixPath('temp/1.txt'),
#  PosixPath('temp/12.text'),
#  PosixPath('temp/123.txt')]

 

temp 폴더 안에 있는 파일과 하위 폴더 이름을 취득해왔습니다.

iterdir() 를 사용해서 취득한 경우 하위 폴더 이름은 취득하지만 하위 폴더 안에 있는 폴더와 파일은 취득해오지는 않습니다.

 

glob() 메서드

이번에는 Path 오브젝트의 glob() 메서드를 사용해서 취득하겠습니다.

glob()에 조건을 설정해 파일 확장자가 txt 파일만 취득하겠습니다.

import pathlib
import re
import pprint

p_temp = pathlib.Path('temp')

print(type(p_temp.glob('**/*.txt')))
# <class 'generator'>

pprint.pprint(list(p_temp.glob('**/*.txt')))
# [PosixPath('temp/[x].txt'),
#  PosixPath('temp/1.txt'),
#  PosixPath('temp/123.txt'),
#  PosixPath('temp/dir/bbb.txt'),
#  PosixPath('temp/dir/sub_dir1/98.txt')]

 

지정한 폴더와 하위 폴더에 있는 파일도 취득했습니다.

glob()와 같이 사용할 수 있는 특수문자는 다음과 같습니다.

–  * :  0개 이상의 임의 문자
–  ? :  임의 문자 1개
–  [] :  특정 문자 1개

 

glob 모듈과 특수 문자를 조합해서 폴더 안에 파일을 취득하는 예제입니다.

import pathlib
import re
import pprint

p_temp = pathlib.Path('temp')

pprint.pprint(list(p_temp.glob('*')))
# [PosixPath('temp/[x].txt'),
#  PosixPath('temp/aaa.text'),
#  PosixPath('temp/dir'),
#  PosixPath('temp/1.txt'),
#  PosixPath('temp/12.text'),
#  PosixPath('temp/123.txt')]

pprint.pprint(list(p_temp.glob('dir/*/*.text')))
# [PosixPath('temp/dir/sub_dir1/ccc.text'),
#  PosixPath('temp/dir/sub_dir2/ddd.text')]

pprint.pprint(list(p_temp.glob('???.*')))
# [PosixPath('temp/[x].txt'),
#  PosixPath('temp/aaa.text'),
#  PosixPath('temp/123.txt')]

pprint.pprint(list(p_temp.glob('[a-z][a-z][a-z].*')))
# [PosixPath('temp/aaa.text')]

 

하위 폴더 파일 취득

마지막으로 지정한 폴더에 하위 폴더를 포함한 모든 파일을 취득하는 예제를 보겠습니다.

pathlib 모듈의 glob()을 사용해서 취득하는 방법입니다.

pathlib 모듈의 glob()에 ** 조건을 사용해 취득하면 폴더 이름만 취득하게 됩니다.

import pathlib
import glob
import re
import pprint

p_temp = pathlib.Path('temp')

pprint.pprint(list(p_temp.glob('**')))
# [PosixPath('temp'),
#  PosixPath('temp/dir'),
#  PosixPath('temp/dir/sub_dir1'),
#  PosixPath('temp/dir/sub_dir2')]

 

하위 폴더와 모든 파일을 취득하기 위해서는 **/* 로 설정해야 합니다.

import pathlib
import glob
import re
import pprint

p_temp = pathlib.Path('temp')

pprint.pprint(list(p_temp.glob('**/*')))
# [PosixPath('temp/[x].txt'),
#  PosixPath('temp/aaa.text'),
#  PosixPath('temp/dir'),
#  PosixPath('temp/1.txt'),
#  PosixPath('temp/12.text'),
#  PosixPath('temp/123.txt'),
#  PosixPath('temp/dir/sub_dir1'),
#  PosixPath('temp/dir/987.text'),
#  PosixPath('temp/dir/bbb.txt'),
#  PosixPath('temp/dir/sub_dir2'),
#  PosixPath('temp/dir/sub_dir1/98.txt'),
#  PosixPath('temp/dir/sub_dir1/ccc.text'),
#  PosixPath('temp/dir/sub_dir2/ddd.text')]

 

지정한 폴더 안에 있는 모든 파일을 취득해왔습니다.

파일만 취득하는 것이 아닌 폴더 이름도 모두 취득해왔습니다.

만약 파일만 취득하고 싶은 경우에는 is_file(), 폴더만 취득하고 싶은 경우는 is_dir()로 판정해서 취득을 하도록 처리를 추가해 줘야 합니다.

댓글