Python에서 파일을 다룰 때 특정 디렉터리에 어떤 파일들이 있는지 확인해야 하는 경우가 자주 발생합니다. 예를 들어, 폴더 안에 있는 모든 Python 파일을 찾고 싶거나, 프로그램 실행 전에 필요한 데이터 파일이 존재하는지 검증해야 할 수도 있습니다.
Python의 os 라이브러리는 이러한 작업을 위한 다양한 메서드를 제공합니다. 핵심 메서드는 다음 두 가지입니다.
- os.listdir(): 지정한 디렉터리 내의 모든 파일과 폴더 목록을 반환합니다.
- os.walk(): 전체 파일 트리를 순회하며 디렉터리와 모든 하위 디렉터리에 있는 파일 목록을 반환합니다.
이 글에서는 두 메서드의 사용법을 예제 코드와 함께 자세히 살펴보겠습니다.
Python os 라이브러리란?
Python의 os 라이브러리는 운영체제와 상호작용할 수 있는 다양한 함수를 제공합니다. os 모듈의 함수들은 Windows, Linux, macOS 등 어떤 현대적인 운영체제에서도 동일하게 작동하므로, 플랫폼에 구애받지 않는 코드를 작성할 수 있습니다.
os는 기본 내장 모듈이지만 사용하기 전에 코드에 임포트해야 합니다. 다음과 같이 import 문을 사용합니다.
import os
os 라이브러리를 임포트했다면, 이제 디렉터리 내 항목을 조회하는 함수들을 사용할 준비가 되었습니다.
os.listdir()로 파일 목록 가져오기
Python에서 os.listdir() 메서드는 지정된 디렉터리 안의 파일과 폴더 목록을 반환합니다. 이 메서드에는 몇 가지 중요한 특징이 있습니다.
- 운영체제가 디렉터리 탐색에 사용하는
'.'(현재 디렉터리)와'..'(상위 디렉터리) 같은 특수 항목은 반환하지 않습니다. - 첫 번째 수준의 파일과 폴더만 반환합니다. 즉, 발견된 하위 폴더 내부의 내용까지는 조회하지 않습니다.
os.listdir() 문법
os.listdir() 함수는 하나의 매개변수를 받습니다. 바로 파일과 폴더 이름을 조회하고자 하는 디렉터리의 경로입니다.
os.listdir(path)
os.listdir() 실전 예제
예를 들어, 지난 10년간 넷플릭스의 주가 성과를 분석하는 프로그램을 만든다고 가정해 보겠습니다. 원본 데이터는 /home/data_analysis/netflix 폴더에 저장되어 있으며, 프로그램이 정상적으로 작동하려면 raw_data_2019.csv 파일이 반드시 해당 폴더에 있어야 합니다. 프로그램 실행 전에 이 파일의 존재 여부를 확인하고 싶다면 어떻게 해야 할까요?
다음 코드로 해당 작업 디렉터리의 파일 목록을 조회할 수 있습니다.
import os
path = '/home/data_analysis/netflix'
files = os.listdir(path)
for f in files:
print(f)
프로그램은 지정된 디렉터리의 모든 파일과 폴더 목록을 가져와 다음과 같이 출력합니다.
README.md
app.py
raw_data_2016.csv
raw_data_2017.csv
raw_data_2018.csv
raw_data_2019.csv
processed_data
출력 결과를 보면 raw_data_2019.csv 파일이 폴더에 존재함을 확인할 수 있습니다.
코드 분석
코드를 한 줄씩 살펴보겠습니다.
- 모듈 임포트: 첫 번째 줄에서 os 모듈을 임포트하여 os.listdir() 함수에 접근할 수 있도록 합니다.
- 경로 변수 선언:
path변수에 내용을 조회하고 싶은 디렉터리 경로를 저장합니다. - 목록 조회: os.listdir() 메서드로
/home/data_analysis/netflix디렉터리의 파일과 폴더 목록을 가져옵니다. - for 루프 출력: for 루프가 os.listdir()이 반환한 리스트의 각 항목을 순회하며, print() 문으로 각 파일 이름을 콘솔에 출력합니다.
/home/data_analysis/netflix 디렉터리에는 여섯 개의 파일과 하나의 디렉터리가 있습니다. processed_data라는 이름의 디렉터리는 확장자가 없다는 점에서 다른 파일들과 구분됩니다.
os.walk()로 하위 디렉터리까지 탐색하기
os.walk() 함수는 파일 트리 전체에 포함된 파일 목록을 조회할 때 사용합니다. 이 메서드는 트리 내의 각 디렉터리를 순회하며, 해당 디렉터리와 모든 하위 디렉터리에 있는 모든 파일과 폴더의 이름을 반환합니다.
os.walk() 문법과 매개변수
os.walk(top, topdown, onerror, followlinks)
os.walk() 메서드는 네 개의 매개변수를 받습니다.
- top: 파일과 폴더 이름을 조회할 최상위 디렉터리입니다. (필수)
- topdown: True로 설정하면 디렉터리를 위에서 아래로(top-down) 스캔하고, False로 설정하면 아래에서 위로(bottom-up) 스캔합니다. (선택)
- onerror: 오류 발생 시 호출될 에러 핸들러를 지정합니다. (선택)
- followlinks: True로 설정하면 시스템 링크(심볼릭 링크)가 참조하는 폴더도 방문합니다. (선택)
onerror와 followlinks는 고급 기능에 해당하고 사용 빈도가 낮으므로, 이 글에서는 앞의 두 매개변수에 집중하겠습니다.
os.walk() 실전 예제
앞서 살펴본 /home/data_analysis/netflix 디렉터리의 모든 파일 이름을 조회하되, 이번에는 하위 디렉터리(processed_data) 내부의 내용까지 함께 찾아보겠습니다.
os.listdir()만으로는 하위 폴더 내부를 볼 수 없지만, os.walk()를 사용하면 가능합니다.
import os
path = '/home/data_analysis/netflix'
for root, directories, files in os.walk(path, topdown=False):
for name in files:
print(os.path.join(root, name))
for name in directories:
print(os.path.join(root, name))
실행 결과는 다음과 같습니다.
/home/data_analysis/netflix/README.md
/home/data_analysis/netflix/app.py
/home/data_analysis/netflix/raw_data_2016.csv
/home/data_analysis/netflix/raw_data_2017.csv
/home/data_analysis/netflix/raw_data_2018.csv
/home/data_analysis/netflix/raw_data_2019.csv
/home/data_analysis/netflix/processed_data
/home/data_analysis/netflix/processed_data/final.csv
결과를 보면 하위 디렉터리인 processed_data 폴더 안에 있던 final.csv 파일까지 함께 조회된 것을 확인할 수 있습니다.
코드 분석
코드의 동작 방식을 자세히 살펴보겠습니다.
- 모듈 임포트: 나중에 코드에서 참조할 os.walk()와 os.path.join() 메서드를 위해 os 모듈을 임포트합니다.
- 경로 변수 선언:
path변수에 탐색 대상 경로를 저장합니다. - 외부 for 루프: os.walk()를 사용해 path 디렉터리의 모든 파일과 폴더를 순회합니다. 여기서
topdown=False를 지정하여 탐색 방식을 설정했습니다. - 내부 for 루프: os.walk()가 반환한 파일과 디렉터리를 각각 추가 for 루프로 순회하며 콘솔에 출력합니다.
- 경로 결합: os.path.join()으로 각 파일의 루트 폴더(예:
/home/data_analysis/netflix)와 파일 이름(예:raw_data_2019.csv)을 연결해 전체 경로를 만듭니다. 여기서 루트 폴더란 해당 파일이 존재하는 디렉터리 경로를 의미합니다.
마무리
Python에서 디렉터리의 파일 목록을 조회하는 방법을 정리하면 다음과 같습니다.
- os.listdir(): 지정한 디렉터리의 첫 번째 수준에 있는 파일과 폴더만 조회합니다.
- os.walk(): 디렉터리는 물론, 그 안의 모든 하위 디렉터리 내용까지 포함하여 전체를 조회합니다.
이 가이드에서는 예제 코드와 함께 os.listdir()과 os.walk() 메서드를 활용해 Python에서 디렉터리의 파일과 폴더를 나열하는 방법을 알아보았습니다. 이제 전문가처럼 디렉터리 파일을 탐색하고 관리할 수 있을 것입니다.