Python 내장 모듈 중 os를 이용해 디렉토리 내의 요소들을 가져올 수 있다.
대표적으로 scandir과 listdir 두 함수가 있는데,
각각 특성이 다르기 때문에 상황에 따라 골라 사용하는 게 좋겠다.
(공식 문서에서는 scandir을 좀 더 권하는 듯하다.)
os.scandir
os.scandir을 사용하면 iterator를 반환한다.
반환 받은 iterator의 각 요소는 os.DirEntry 클래스에 속하기 때문에
해당 클래스의 method를 사용할 수 있다.
대표적인 method들은 다음과 같다.
- name : 요소 이름
- path : 절대경로
- is_file : 일반 파일의 경우 True 반환
- is_dir : 디렉토리의 경우 True 반환
...
os.listdir
os.listdir을 사용하면 list를 반환한다.
반환 받은 list의 각 요소는 str, 즉 문자형에 속한다.
따라서, 보통 os.path의 여러 method를 같이 사용하는 편이다.
- os.path.join : 디렉토리와 요소를 함께 사용해 절대경로 반환
- os.path.isfile : 일반 파일의 경우 True 반환
- os.path.isdir : 디렉토리의 경우 True 반환
...
두 함수를 단순한 예시에 적용해 비교해보았다.
| os.scandir의 경우 | os.listdir의 경우 |
| pdir = "/path/to/directory" with os.scandir(pdir) as scdir: for entry in scdir: print("Name:", entry.name) print("File:", entry.is_file()) print("Dir.:", entry.is_dir()) print("Abs. path:", entry.path) print(f"[ {entry.name} ]") with os.scandir(entry.path) as scdir2: for entry2 in scdir2: print(" |--", f"[ {entry2.name} ]") print("-"*80) |
pdir = "/path/to/directory" listdir = os.listdir(pdir) for entry in listdir: abspath = os.path.join(pdir, entry) print("Name:", entry) print("File:", os.path.isfile(abspath)) print("Dir.:", os.path.isdir(abspath)) print("Abs. path:", abspath) print(f"[ {entry} ]") listdir2 = os.listdir(abspath) for entry2 in listdir2: print(" |--", f"[ {entry2} ]") print("-"*80) |
| 결과 (두 결과 모두 동일) | |
| Name: 2024 File: False Dir.: True Abs. path: /data7/NCEP/CFSv2/Operational_9-month_Forecast/6-hourly/flxf/nc/2024 [ 2024 ] |-- [ 202405 ] |-- [ 202411 ] |-- [ 202409 ] |-- [ 202408 ] |-- [ 202401 ] |-- [ 202402 ] |-- [ 202412 ] |-- [ 202410 ] |-- [ 202403 ] |-- [ 202407 ] |-- [ 202406 ] |-- [ 202404 ] -------------------------------------------------------------------------------- Name: 2025 File: False Dir.: True Abs. path: /data7/NCEP/CFSv2/Operational_9-month_Forecast/6-hourly/flxf/nc/2025 [ 2025 ] |-- [ 202501 ] |-- [ 202503 ] |-- [ 202502 ] -------------------------------------------------------------------------------- |
|
두 함수 모두 동일한 기능을 수행할 수 있다.
만약 특정 디렉토리 내의 요소들을 단순한 문자형으로만 얻고자 한다면
listdir이 좀 더 빠른 방법일 수 있다.
하지만, 각 요소의 특성을 더 필요로 한다면
scandir이 좀 더 유용할 수 있다.
두 함수 공통적으로 주의해야 할 사항으로는,
반환 받은 요소가 이름순으로 정렬되어 있지 않다는 것이다.
따라서 일정한 순서로 정렬이 필요한 경우
사용자가 따로 sorting을 해줘야 한다.
(나는 보통 sort 메서드나 sorted 함수를 사용하는 편이다.)
- 끝 -
'공부 > Python' 카테고리의 다른 글
| [ERROR] Matplotlib으로 figure/axes 생성 시 xcb 관련 오류 (0) | 2025.10.01 |
|---|---|
| [Web crawling] 웹페이지에서 하이퍼링크 크롤링 후 다운로드 - GPCP 월별 강수량 데이터 (2) | 2025.07.02 |
| [ERROR] for 반복문에서 dictionary 다룰 때 성분을 함부로 제거하지 말 것 (0) | 2025.05.29 |
| [ERROR] Matplotlib Figure 생성 시 Qt 문제 (0) | 2025.01.10 |
| [Anaconda] 지난 설치 파일 모아보기 (5) | 2024.10.11 |