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

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

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

경로명은 특정한 순서 없이 반환돼요. 특정 순서가 필요하면 결과를 정렬해야 해요. 기본적으로 점(.)으로 시작하는 파일은 fnmatch.fnmatch()pathlib.Path.glob()과 달리 점으로 시작하는 패턴에만 매칭돼요. 틸드 및 셸 변수 확장에는 os.path.expanduser()os.path.expandvars()를 사용해요. 리터럴 매칭을 원하면 메타 문자를 대괄호로 감싸요. 예를 들어 '[?]'는 문자 '?'와 매칭돼요.

출처: Python documentation

본문

함수

glob.glob(pathname, *, root_dir=None, dir_fd=None, recursive=False, include_hidden=False)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이 참이면 와일드카드가 점(.)으로 시작하는 경로 세그먼트와 매칭될 수 있어요.

큰 디렉터리 트리에서 ** 패턴을 사용하면 지나치게 많은 시간이 걸릴 수 있어요. pathname이 여러 ** 패턴을 포함하고 recursive가 참이면 이 함수는 중복 경로명을 반환할 수 있어요. 파일 시스템을 스캔할 때 발생하는 OSError 예외는 억제돼요. 여기에는 읽기 권한이 없는 디렉터리에 접근할 때의 PermissionError도 포함돼요.

버전 3.5에서 변경: **을 사용한 재귀 glob 지원. 버전 3.10에서 변경: root_dirdir_fd 파라미터가 추가됨. 버전 3.11에서 변경: include_hidden 파라미터가 추가됨.

glob.iglob(pathname, *, root_dir=None, dir_fd=None, recursive=False, include_hidden=False)glob()과 동일한 값을 모두 동시에 저장하지 않고 산출하는 이터레이터를 반환해요.

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

버전 3.4에서 추가됨.

glob.translate(pathname, *, recursive=False, include_hidden=False, seps=None) — 주어진 경로 사양을 re.match()에서 사용할 정규식으로 변환해요. 경로 사양은 셸 스타일 와일드카드를 포함할 수 있어요. 예를 들어:

>>> import glob, re
>>> regex = glob.translate('**/*.txt', recursive=True, include_hidden=True)
>>> reobj = re.compile(regex)
>>> reobj.match('foo/bar/baz.txt')
<re.Match object; span=(0, 15), match='foo/bar/baz.txt'>

경로 구분자와 세그먼트는 fnmatch.translate()와 달리 이 함수에 의미가 있어요. 기본적으로 와일드카드는 경로 구분자와 매칭되지 않고, * 패턴 세그먼트는 정확히 하나의 경로 세그먼트와 매칭돼요. recursive가 참이면 패턴 세그먼트 **이 임의 개수의 경로 세그먼트와 매칭돼요. seps 인자로 경로 구분자 시퀀스를 제공할 수 있으며, 제공하지 않으면 os.sepaltsep(가능하면)이 사용돼요.

버전 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']

디렉터리가 .로 시작하는 파일을 포함하면 기본적으로 매칭되지 않아요. 예를 들어 card.gif.card.gif를 포함하는 디렉터리에서:

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

참고

  • fnmatch 모듈 — 셸 스타일 파일명(경로가 아님) 확장.
  • pathlib 모듈 — 고수준 경로 객체.

더 알아보기 (Learn more)