개발부터 자유까지
[Python] os.walk VS os.listdir 차이점 알아보기 본문
목차
os.listdir 와 os.walk 차이점 알아보기
Python 안에는 os 모듈이 있는데 운영체제(operating system) 의 준말이다. 운영체제에서 제공해주는 여러 함수들을 사용할 수 있게 해준다. 파일을 열고 닫는 기능, 디렉토리나 파일의 목록을 구하는 기능 등을 제공한다.
그 중에서도 디렉토리와 파일을 탐색하는 os.listdir 함수와 os.walk 함수의 역할을 비교해보고 차이점을 알아보자.
아레 os_test 디렉토리 구조는 아래와 같고 이를 기반으로 것들로 테스트해본다.
PS D:\toy_project\os_test> tree /f .
D:\TOY_PROJECT\OS_TEST
│ file3.txt
│ main.py
│
├─dir1
│ file1.txt
│
└─dir2
└─sub_dir2
file2.txt
os.listdir
os.listdir(path) 형식으로 사용하는데 특정 경로(path)에 있는 디렉토리와 파일들을 리스트로 반환한다.
import os
file_path = "D:\\toy_project\\test"
print(os.listdir(file_path))
##### 출력 #####
['dir1', 'dir2', 'file3.txt', 'main.py']
출력 결과물을 보면
os_test 디렉토리 밑에 있는 디렉토리와 파일이 출력되는데, dir1 하위에 있는 file1.txt 파일과 dir2 하위에 있는 sub_dir2 디렉토리와 file2.txt 파일은 출력되지 않았다.
1개의 depth까지만 보여준다는 얘기다.
os.walk
os.walk(top, topdown=True, onerror=None, followlinks=False) 형식으로 사용하는데 특정 경로(path)에 있는 디렉토리와 파일들을 재귀적으로 탐색해서 리스트로 반환한다. top이라는 인자는 디렉토리 트리의 root 디렉토리를 뜻한다. 탐색 시작점이라고 보면 된다.
os.listdir와 다르게 os.walk의 3가지 값(경로, 경로 내 디렉토리 리스트, 경로 내 파일 리스트)을 튜플 구조체에 넣어서 리턴한다.
PS D:\toy_project\os_test> python .\main.py
#출력: <generator object _walk at 0x000002939F469A10>
그래서 튜플 객체 자체를 출력하기 때문에 아래 코드처럼 for 문을 넣어 소스코드를 고쳐본다.
3가지 값을 리턴하기 때문에 for문의 path, dir, file 이터레이터를 통해 하나씩 출력하는 코드이다. for문을 돌면서 출력하는 path값은 탐색을 시작하는 디렉토리나 파일이 된다.
import os
file_path = "D:\\toy_project\\os_test"
for path, dir, file in os.walk(file_path):
print("path: ", path)
print("dir: ", dir)
print("file: ", file)
print("--------------")
##### 출력 #####
root: D:\toy_project\os_test
d_path: ['dir1', 'dir2']
file_path: ['file3.txt', 'main.py']
=================================
root: D:\toy_project\os_test\dir1
d_path: []
file_path: ['file1.txt']
=================================
root: D:\toy_project\os_test\dir2
d_path: ['sub_dir2']
file_path: []
=================================
root: D:\toy_project\os_test\dir2\sub_dir2
d_path: []
file_path: ['file2.txt']
=================================
출력 결과를 보면
root, d_path, file_path 를 나란히 출력하는데, os_test 디렉토리를 root 디렉토리로 탐색하면, 하위에 디렉토리가 있으니 d_path에 출력되고, 파일이 있으면 file_path가 출력된다.
한 가지 주의할 점은 세번째 dir2 디렉토리가 root 디렉토리가 되어 탐색할 때, sub_dir2 디렉토리가 d_path에 출력되고 그 하위에 file2.txt 파일이 file_path에 출력되지는 않는다. 이유는 탐색할 때, dir2 기준에서 1개 depth까지만 탐색하기 때문이다.
두 함수를 적당한 곳에 잘 사용하면 되는데 보통은 os.listdir 함수 사용 빈도가 더 높은것 같다.
* 참고
'Python' 카테고리의 다른 글
[Python] input vs sys.stdin.readline (0) | 2024.08.25 |
---|---|
[Python] json.dumps vs json.dump (1) | 2024.06.11 |
[Python] websockets 웹소켓 모듈 (0) | 2024.01.18 |
[Python] 문자열 포맷팅 3가지 방식 (0) | 2024.01.16 |
[Python] vscode에서 black formatter 사용하기 (0) | 2024.01.15 |