Glob()을 써서 재귀적으로 파일을 찾는 방법?


Glob()을 써서 재귀적으로 파일을 찾고 싶습니다.

제가 쓰는 코드는 Glob(os.path.join('src','*.c')) 인데 이 코드는 현재 src디렉토리에서만 .c파일을 찾아줍니다. src의 하위 디렉토리에서도 .c파일을 찾으려면 어떻게 해야 하나요?

지금은 임시로 밑의 소스코드같이 쓰고 있지만 파이썬스러운 방법도 아니고 코드가 지저분해 보여서 다른 분들의 도움을 받고 싶습니다.

소스코드

Glob(os.path.join('src','*.c'))
Glob(os.path.join('src','*','*.c'))
Glob(os.path.join('src','*','*','*.c'))
Glob(os.path.join('src','*','*','*','*.c'))
  • 2016년 01월 19일에 작성됨

조회수 399


1 답변


좋아요
1
싫어요
채택취소하기

glob.iglob(pathname, recursive=False) - 파이썬 3.5이상

파이썬 3.5아상에서는 glob 모듈이 "**" directive 를 지원합니다.

따라서 질문하신 경우 다음과 같이 써주면 됩니다.

import glob

for filename in glob.iglob('src/**/*.c', recursive=True):
    print(filename)

프린트가 아니라 list가 필요하신 경우는 위 코드의 glob.iglobglob.glob 로 바꿔주세요

파이썬 2.2 ~ 3.4

구버전에서는 디렉토리를 재귀적으로 검사할 때 os.walk를, 파일 이름을 검사할 때는 fnmatch.filter를 씁니다.

import fnmatch
import os

matches = []
for root, dirnames, filenames in os.walk('src'):
    for filename in fnmatch.filter(filenames, '*.c'):
        matches.append(os.path.join(root, filename))

파이선 2.1이하

파이썬 2.1 이하에서는 2.2~3.4의 코드에서 fnmatch.filterglob.glob으로 바꿔줘야 합니다.


로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close