Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬 fnmatch 모듈로 유닉스 파일 이름 패턴 매칭하기

유닉스 셸 명령줄에서 사용하는 와일드카드 패턴은 정규 표현식(RegEx) 문법과는 다른 규칙을 따릅니다. 파이썬 표준 라이브러리의 fnmatch 모듈은 이러한 유닉스 스타일 와일드카드 패턴으로 파일 이름을 검사할 수 있는 기능을 제공합니다.

fnmatch 모듈에는 다음과 같은 함수들이 정의되어 있습니다.

1. fnmatch()

이 함수는 파일 이름과 문자열 패턴, 두 개의 인자를 받습니다. 파일 이름이 주어진 패턴과 일치하면 True, 그렇지 않으면 False를 반환합니다.

다음 예제는 현재 디렉터리에서 "*.py" 패턴에 일치하는 모든 파일을 출력합니다.

>>> import glob, fnmatch
>>> for file in glob.glob('*.*'):
    if fnmatch.fnmatch(file, "*.py"):
        print(file)

참고로 fnmatch()는 운영체제의 규칙을 따르기 때문에, Windows 환경에서는 대소문자를 구분하지 않고 비교합니다. 대소문자를 항상 구분하고 싶다면 아래의 fnmatchcase()를 사용해야 합니다.

2. fnmatchcase()

이 함수는 fnmatch()와 사용법이 같지만, 운영체제와 무관하게 항상 대소문자를 엄격하게 구분하여 패턴과 파일 이름을 비교한다는 점이 다릅니다.

아래 예제에서는 이름이 'l'로 시작하는 파일들을 먼저 리스트로 수집한 뒤, fnmatchcase() 함수를 적용해 'lo'로 시작하는 파일 이름만 골라 출력합니다.

>>> files = glob.glob("l*.*")
>>> files
['LICENSE.txt', 'lines.txt', 'listwidget.ui', 'lo1.ui', 'lo2.ui', 'lo3.ui', 'logo.png', 'logo.svg', 'lw.ui']
>>> for file in files:
    if fnmatch.fnmatchcase(file, "lo*.*") == True:
        print(file)
lo1.ui
lo2.ui
lo3.ui
logo.png
logo.svg

3. filter()

이 함수는 리스트에 담긴 여러 파일 이름 중에서 지정한 패턴과 일치하는 항목만 걸러내어 새 리스트로 반환합니다.

다음 코드는 현재 디렉터리의 전체 파일 중 '.txt' 확장자를 가진 파일들의 목록을 반환합니다.

>>> fnmatch.filter(files, "*.txt")
['a!.txt', 'data().txt', 'dict.txt', 'json.txt', 'LICENSE.txt', 'lines.txt', 'msg.txt', 'NEWS.txt', 'test.txt', 'zen.txt', 'zen1.txt', 'zenbak.txt']

4. translate()

이 함수는 유닉스 스타일의 와일드카드 패턴을 동일한 의미를 가진 정규 표현식 문자열로 변환할 때 유용합니다. translate()의 반환값은 re 모듈의 compile() 함수로 컴파일한 뒤, 실제 패턴 매칭에 사용할 수 있습니다.

>>> pattern = "*.txt"
>>> import re
>>> reg = fnmatch.translate(pattern)
>>> reg
'(?s:.*\\.txt)\\Z'
>>> rec = re.compile(reg)
>>> for file in glob.glob("*.*"):
    if re.match(rec, file):
        print(file)

마무리

이상으로 파이썬 fnmatch 모듈에서 제공하는 네 가지 함수인 fnmatch(), fnmatchcase(), filter(), translate()의 사용법을 살펴보았습니다. glob 모듈과 함께 활용하면 특정 조건에 맞는 파일을 손쉽게 검색하고 필터링할 수 있으므로, 파일 자동화 작업 시 매우 유용하게 사용됩니다.