Python에서 특정 디렉터리 내에 있는 파일을 찾고 싶다면 os.walk를 사용해 디렉터리 트리를 순회하면 됩니다. os.walk는 지정한 경로를 루트로 하여 모든 하위 폴더와 파일을 재귀적으로 탐색해 주는 강력한 도구입니다.
기본 예제 코드
아래는 파일 이름과 검색할 디렉터리를 인자로 받아, 일치하는 모든 파일의 전체 경로를 리스트로 반환하는 함수입니다.
import os
def find_file(file_name, directory_name):
files_found = []
for path, subdirs, files in os.walk(directory_name):
for name in files:
if file_name == name:
file_path = os.path.join(path, name)
files_found.append(file_path)
return files_found
find_file('my_file.txt', 'my_folder')동작 원리
os.walk(directory_name)는 각 반복마다 세 가지 값을 반환합니다.
- path: 현재 탐색 중인 디렉터리 경로
- subdirs: 해당 디렉터리 안의 하위 폴더 목록
- files: 해당 디렉터리 안의 파일 목록
이 중 files 목록을 하나씩 확인하면서 찾으려는 파일 이름과 일치하면 os.path.join()으로 전체 경로를 만들어 결과 리스트에 추가합니다. 덕분에 하위 폴더 깊숙이 있는 파일까지도 놓치지 않고 찾을 수 있습니다.
예제 폴더 구조
스크립트를 실행할 때 아래와 같은 폴더 구조가 있다고 가정해 보겠습니다.
my_folder/
another_folder/
my_file
another_file
hello.py
my_file실행 결과
위 구조에서 my_file을 검색하면 다음과 같이 두 개의 경로가 출력됩니다.
['/my_folder/another_folder/my_file', '/my_folder/my_file']
최상위 폴더와 하위 폴더(another_folder)에 같은 이름의 파일이 존재하기 때문에 두 위치가 모두 결과에 포함된 것을 확인할 수 있습니다.
참고: 부분 일치 검색이 필요할 때
파일 이름이 정확히 일치하지 않고 특정 문자열을 포함하는 파일을 찾고 싶다면 조건문을 다음과 같이 바꾸면 됩니다.
if file_name in name:
또한 확장자 패턴으로 파일을 찾고 싶다면 glob 모듈의 glob.glob('**/*.txt', recursive=True)를 활용하는 것도 좋은 대안입니다.