glob — Unix 스타일 경로명 패턴 확장

glob — Unix 스타일 경로명 패턴 확장

glob 모듈은 Unix 셸과 비슷한 패턴 매칭 규칙을 사용해 경로명을 찾아요. 물결(~) 확장은 하지 않지만, *, ?, 그리고 []로 표현한 문자 범위는 올바르게 매칭됩니다. 이는 실제로 서브셸을 호출하는 게 아니라 os.scandir()fnmatch.fnmatch() 함수를 함께 사용해 이뤄져요.

참고: 경로명은 특별한 순서 없이 반환됩니다. 특정 순서가 필요하면 결과를 정렬하세요.

기본적으로 점(.)으로 시작하는 파일은 fnmatch.fnmatch()pathlib.Path.glob()와 달리, 역시 점으로 시작하는 패턴으로만 매칭돼요. 물결과 셸 변수 확장은 os.path.expanduser()os.path.expandvars()를 사용하세요.

리터럴 매칭을 하려면 메타 문자를 대괄호로 감싸요. 예를 들어 '[?]'는 문자 '?'와 매칭됩니다.

출처: Python 표준 라이브러리

glob()

  • glob.glob(pathname, *, root_dir=None, dir_fd=None, recursive=False, include_hidden=False)

pathname과 일치하는 경로 이름들의 (아마도 빈) 리스트를 반환해요. pathname은 경로 명세를 담은 문자열이어야 합니다. pathname은 절대 경로(/usr/src/Python-1.5/Makefile처럼)일 수도, 상대 경로(../../Tools/*/*.gif처럼)일 수도 있고, 셸 스타일 와일드카드를 담을 수 있어요. 깨진 심볼릭 링크도 (셸에서처럼) 결과에 포함됩니다. 결과가 정렬되는지는 파일 시스템에 따라 달라져요. 이 함수를 호출하는 동안 조건을 만족하는 파일이 제거되거나 추가되면, 그 파일에 대한 경로 이름이 포함될지는 명세되어 있지 않습니다.

root_dirNone이 아니면, 검색의 루트 디렉터리를 지정하는 path-like 객체여야 해요. 이는 glob()을 호출하기 전에 현재 디렉터리를 바꾸는 것과 같은 효과를 줍니다. pathname이 상대적이면, 결과는 root_dir에 상대적인 경로를 담게 돼요.

이 함수는 dir_fd 매개변수로 디렉터리 서술자에 상대적인 경로를 지원할 수 있어요.

recursive가 참이면, 패턴 "**"이 모든 파일과 0개 이상의 디렉터리·서브디렉터리·디렉터리로의 심볼릭 링크와 매칭됩니다. 패턴 뒤에 os.sep이나 os.altsep이 따르면 파일은 매칭되지 않아요.

include_hidden이 참이면, 와일드카드가 점(.)으로 시작하는 경로 세그먼트와 매칭될 수 있습니다.

감사 이벤트 glob.glob을 인자 pathname, recursive로 발생시켜요. 감사 이벤트 glob.glob/2를 인자 pathname, recursive, root_dir, dir_fd로 발생시킵니다.

참고: 큰 디렉터리 트리에서 "**" 패턴을 쓰면 엄청난 시간을 소모할 수 있어요.

참고: pathname에 여러 "**" 패턴이 있고 recursive가 참이면 이 함수는 중복 경로 이름을 반환할 수 있어요.

참고: 파일 시스템을 스캔하면서 발생하는 어떤 OSError 예외도 억제됩니다. 읽기 권한이 없는 디렉터리에 접근할 때의 PermissionError도 포함돼요.

버전 3.5에서 변경: "**"을 사용한 재귀 glob 지원. 버전 3.10에서 변경: root_dirdir_fd 매개변수 추가. 버전 3.11에서 변경: include_hidden 매개변수 추가.

iglob()

  • glob.iglob(pathname, *, root_dir=None, dir_fd=None, recursive=False, include_hidden=False)

glob()과 같은 값을, 전부 동시에 저장하지 않고 양보하는 이터레이터를 반환해요.

감사 이벤트 glob.glob을 인자 pathname, recursive로, 감사 이벤트 glob.glob/2를 인자 pathname, recursive, root_dir, dir_fd로 발생시킵니다. (중복 경로 및 OSError 억제에 대한 참고는 glob()과 동일합니다.)

버전 3.5·3.10·3.11 변경 사항은 glob()과 동일해요.

escape()

  • glob.escape(pathname)

모든 특수 문자('?', '*', '[')를 이스케이프해요. 특수 문자가 들어 있을 수 있는 임의의 리터럴 문자열을 매칭하고 싶을 때 유용합니다. 드라이브/UNC 공유 지점의 특수 문자는 이스케이프되지 않아요. 예를 들어 Windows에서 escape('//?/c:/Quo vadis?.txt')'//?/c:/Quo vadis[?].txt'를 반환합니다.

버전 3.4에서 추가됨.

translate()

  • glob.translate(pathname, *, recursive=False, include_hidden=False, seps=None)

주어진 경로 명세를 re.match()에 사용할 정규식으로 변환해요. 경로 명세는 셸 스타일 와일드카드를 담을 수 있습니다.

예를 들어:

>>> import glob, re
>>>
>>> regex = glob.translate('**/*.txt', recursive=True, include_hidden=True)
>>> regex
'(?s:(?:.+/)?[^/]*\\.txt)\\Z'
>>> reobj = re.compile(regex)
>>> reobj.match('foo/bar/baz.txt')
<re.Match object; span=(0, 15), match='foo/bar/baz.txt'>

fnmatch.translate()와 달리 이 함수에는 경로 구분자와 세그먼트가 의미가 있어요. 기본적으로 와일드카드는 경로 구분자와 매칭하지 않고, * 패턴 세그먼트는 정확히 하나의 경로 세그먼트와 매칭됩니다.

recursive가 참이면 패턴 세그먼트 "**"이 임의 개수의 경로 세그먼트와 매칭돼요. include_hidden이 참이면 와일드카드가 점(.)으로 시작하는 경로 세그먼트와 매칭될 수 있습니다.

seps 인자에 경로 구분자 시퀀스를 제공할 수 있어요. 주어지지 않으면 os.sepaltsep(사용 가능하면)이 사용됩니다.

(이 함수를 호출해 패턴 매칭과 globbing을 구현하는 pathlib.PurePath.full_match()pathlib.Path.glob() 메서드도 함께 보세요.) 버전 3.13에서 추가됨.

예제

디렉터리에 1.gif, 2.txt, card.gif 파일과, 3.txt 파일만 담긴 서브디렉터리 sub가 있다고 해 볼게요. glob()은 다음 결과를 만들어냅니다. 경로의 선두 구성요소들이 어떻게 보존되는지 주목하세요.

>>> import glob
>>> glob.glob('./[0-9].*')
['./1.gif', './2.txt']
>>> glob.glob('*.gif')
['1.gif', 'card.gif']
>>> glob.glob('?.gif')
['1.gif']
>>> glob.glob('**/*.txt', recursive=True)
['2.txt', 'sub/3.txt']
>>> glob.glob('./**/', recursive=True)
['./', './sub/']

디렉터리에 .로 시작하는 파일이 있으면 기본적으로 매칭되지 않아요. 예를 들어 card.gif.card.gif를 담은 디렉터리를 생각해 보죠:

>>> import glob
>>> glob.glob('*.gif')
['card.gif']
>>> glob.glob('.c*')
['.card.gif']

함께 보기: fnmatch 모듈 — 셸 스타일 파일명(경로가 아닌) 확장. pathlib 모듈 — 고수준 경로 객체.

더 알아보기