glob 모듈을 사용해 파일이나 폴더 이름을 리스트 또는 이터레이터로 취득하는 예제를 보겠습니다.
폴더 구성은 아래처럼 만들고 샘플 소스를 만들겠습니다.
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
glob 사용 방법
먼저 glob의 기본적인 사용 방법을 보겠습니다.
import glob
import re
import os
ls = glob.glob('temp/*.txt')
print(ls)
# ['temp/[x].txt', 'temp/1.txt', 'temp/123.txt']
print(type(ls))
# <class 'list'>
glob은 특수 문자를 같이 사용할 수 있습니다.
그리고 조건에 만족하는 값은 리스트 형태로 반환합니다.
glob에 조건을 설정할 때 사용 가능한 특수문자를 보겠습니다.
* : 임의의 글자 0개 이상
*는 와일드카드 문자로 0개 이상의 임의의 문자열을 의미합니다.
import glob
import re
import os
print(glob.glob('temp/*'))
# ['temp/[x].txt', 'temp/aaa.text', 'temp/dir', 'temp/1.txt', 'temp/12.text', 'temp/123.txt']
print(glob.glob('temp/*.txt'))
# ['temp/[x].txt', 'temp/1.txt', 'temp/123.txt']
print(glob.glob('temp/dir/*/*.text'))
# ['temp/dir/sub_dir1/ccc.text', 'temp/dir/sub_dir2/ddd.text']
? : 임의의 한 글자
?은 임의의 문자 글자 수 하나를 의미합니다.
예를 들어 파일 이름이 3글자인 파일만 취득하는 예제를 보겠습니다.
import glob
import re
import os
print(glob.glob('temp/???.*'))
# ['temp/[x].txt', 'temp/aaa.text', 'temp/123.txt']
[] : 특정 문자 한글자
[] 괄호 안에 감싼 문자열 중 일치하는 문자가 있는지 판단합니다.
예를 들어 [0-9]는 0부터 9사이의 숫자를 의미하며, [a-z]는 알파벳 a부터 z까지를 의미합니다.
import glob
import re
import os
print(glob.glob('temp/[0-9].*'))
# ['temp/1.txt']
print(glob.glob('temp/[0-9][0-9].*'))
# ['temp/12.text']
print(glob.glob('temp/[a-z][a-z][a-z].*'))
# ['temp/aaa.text']
recursive 재귀 취득
파이썬 3.5부터 ** 와일드카드 2개를 사용해 재귀 처리를 할 수 있게 되었습니다.
파라미터 recursive=True 로 설정하고 ** 로 작성하면 하위 폴더에도 접근할 수 있습니다.
import glob
import re
import os
print(glob.glob('temp/dir/*/*.text'))
# ['temp/dir/sub_dir1/ccc.text', 'temp/dir/sub_dir2/ddd.text']
print(glob.glob('temp/**/*.text', recursive=True))
# ['temp/aaa.text', 'temp/12.text', 'temp/dir/987.text', 'temp/dir/sub_dir1/ccc.text', 'temp/dir/sub_dir2/ddd.text']
지정한 폴더에 있는 하위 폴더에 있는 파일을 포함한 모든 파일을 취득하고 싶은 경우는 폴더/** 만 작성해 주면 모두 취득합니다.
import glob
import re
import os
print(glob.glob('temp/**', recursive=True))
# ['temp/', 'temp/[x].txt', 'temp/aaa.text', 'temp/dir', 'temp/dir/sub_dir1', 'temp/dir/sub_dir1/98.txt', 'temp/dir/sub_dir1/ccc.text', 'temp/dir/987.text', 'temp/dir/bbb.txt', 'temp/dir/sub_dir2', 'temp/dir/sub_dir2/ddd.text', 'temp/1.txt', 'temp/12.text', 'temp/123.txt']
파일만 취득
glob을 사용하는 경우 모든 파일과 폴더 이름도 취득합니다.
만약 폴더 이름은 제외한 파일 이름만 취득하고 싶은 경우는 isfile()을 같이 사용합니다.
import glob
import re
import os
print([p for p in glob.glob('temp/**', recursive=True)
if os.path.isfile(p)])
# ['temp/[x].txt', 'temp/aaa.text', 'temp/dir/sub_dir1/98.txt', 'temp/dir/sub_dir1/ccc.text', 'temp/dir/987.text', 'temp/dir/bbb.txt', 'temp/dir/sub_dir2/ddd.text', 'temp/1.txt', 'temp/12.text', 'temp/123.txt']
폴더를 제외한 파일만 취득을 하였습니다.
폴더만 취득
폴더 이름만 취득하고 싶은 경우는 isdir()을 같이 사용합니다.
import glob
import re
import os
print(glob.glob('temp/**/', recursive=True))
# ['temp/', 'temp/dir/', 'temp/dir/sub_dir1/', 'temp/dir/sub_dir2/']
파일은 제외하고 폴더 이름만 취득하였습니다.
이터레이터 형식으로 취득
glob()은 리스트 형식으로 값을 취득합니다.
파일이나 폴더 이름을 취득해 for 문에서 처리를 하고 싶은 경우에는 리스트 형식이 아닌 이터레이터 형식으로 취득하도록 iglob()를 사용해야 합니다.
import glob
import re
import os
print(type(glob.iglob('temp/*.txt')))
# <class 'generator'>
for p in glob.iglob('temp/*.txt'):
print(p)
# temp/[x].txt
# temp/1.txt
# temp/123.txt
iglob() 는 이터레이터 형식으로 반환할 뿐 glob()과 동일하게 recursive 를 사용할 수 있습니다.
댓글