다음은 Pat의 답변에 대한 한 줄의 목록 이해 변형입니다 (특정 프로젝트 디렉토리에서 가져오고 싶었던 것도 포함).
import os, glob
exts = ['*.txt', '*.mdown', '*.markdown']
files = [f for ext in exts for f in glob.glob(os.path.join(project_dir, ext))]
확장명 ( for ext in exts
)을 반복 한 다음 각 확장명에 대해 각 패턴 ( for f in glob.glob(os.path.join(project_dir, ext)
)과 일치하는 각 파일을 가져옵니다 .
이 솔루션은 짧고 불필요한 for 루프, 중첩 목록 이해 또는 코드를 어지럽히는 기능이 없습니다. 순수하고 표현력있는 파이톤 선 입니다.
이 솔루션을 사용하면 exts
코드를 업데이트하지 않고도 사용자 정의 목록을 변경할 수 있습니다. (이것은 항상 좋은 습관입니다!)
list-comprehension은 Laurent의 솔루션 (투표 한)과 동일합니다. 그러나 별도의 기능으로 한 줄을 제외하는 것이 일반적으로 필요하지 않다고 주장하므로 대안 솔루션으로 제공하고 있습니다.
보너스:
단일 디렉토리뿐만 아니라 모든 서브 디렉토리도 검색해야하는 경우 recursive=True
다중 디렉토리 glob 기호 **
1을 전달 하고 사용할 수 있습니다 .
files = [f for ext in exts
for f in glob.glob(os.path.join(project_dir, '**', ext), recursive=True)]
이것은 glob.glob('<project_dir>/**/*.txt', recursive=True)
각 확장에 대해 호출됩니다 .
1 기술적으로 **
glob 기호는 슬래시를 포함하여 하나 이상의 문자와 일치 /
합니다 (단일 *
glob 기호 와 달리 ). 실제로는 **
슬래시 (경로 구분 기호)로 둘러싸면 0 개 이상의 디렉토리와 일치 한다는 사실 만 기억하면됩니다 .