디렉토리 탐색
모든 하위 디렉토리 내부 파일까지 포함된 전체 파일의 목록을 가져오기 위해 파이썬으로 코드를 작성하려고 한다.
그런데 디렉토리(또는 폴더) 내부에 하위 디렉토리가 있다면?
그리고 그 디렉토리 내부에 하위 디렉토리가 있는지 없는지 모른다면?
코드를 어떻게 작성해야 될까?
먼저 파이썬에서 경로를 다루기위해 os 패키지를 import 했다.
그리고 아래와 같은 디렉토리 구조(주석)를 만들어 둔 뒤 하위 디렉토리 어딘가에 FindMe.txt 파일을 숨겨두었다!
#Find_TMP
#┣━1234
#┗━TEST
# ┗━TEST1
import os
os 모듈 내부의 메소드들을 사용해서 FindMe.txt 파일이 어디에 있는지 찾아보자.
os.listdir() 메소드를 사용하면 입력한 폴더 내부에 존재하는 파일과 디렉토리를 모두 가져올 수 있다.
def findFiles(root):
files = os.listdir(root)
for file in files:
path = os.path.join(root, file)
if os.path.isdir(path):
print("Directory :", path)
else:
print("File :", path)
findFiles("C:/Users/Hwan/Desktop/Find_TMP")
Find_dir의 하위 디렉토리인 1234와 TEST는 잘 찾았지만 우리가 원하는 FindMe.txt 파일은 찾지 못했다.
1234와 TEST 내부까지 확인하려면 그리고 내부에 우리가 알지 못하는 디렉토리가 있다면 어떻게 해야될까?
재귀를 이용한 디렉토리 탐색
디렉토리 내부에 디렉토리, 그리고 그 내부에 디렉토리 그리고 또 하위 디렉토리.. 만들어둔 구조를 보고 있으면 뭔가 떠오르는 것 같다..!
재귀를 사용해서 모든 경로를 확인해보자.
def findFiles_recursion(path):
for x in os.listdir(path):
subdirectory_path = f"{path}/{x}"
print(subdirectory_path)
if os.path.isdir(subdirectory_path):
findFiles_recursion(subdirectory_path)
findFiles_recursion("C:/Users/Hwan/Desktop/Find_TMP")
우리가 원하던 FindMe.txt 파일을 드디어 찾았다!
위 구조에선 숨겨져있던 Secret 디렉토리 내부까지 확인이 되었다.
하지만 만약 폴더의 구조가 매우 깊다면 재귀를 사용한 함수는 Runtime Error를 뱉는다.
import sys
sys.setrecursionlimit(10000)
물론 이런 코드를 추가하면 좀 더 깊게 탐색할 수는 있지만 스택을 사용하면 더 좋을 것 같다.
코드로 작성해보자.
def findFiles_stack(path):
list_stack = [path]
while list_stack.__len__():
cur_path = list_stack.pop()
for x in os.listdir(cur_path):
_path = os.path.join(cur_path, x)
if os.path.isdir(_path):
list_stack.append(_path)
print(_path)
findFiles_stack("C:/Users/Hwan/Desktop/Find_TMP")
탐색 순서는 조금 다르지만 이제 깊이에 상관없이 FindMe.txt를 찾을 수 있게 되었다!
os.walk
그런데 사실 파이썬의 os 모듈에서는 위에서 고민했던 내용들을 한번에 해결해줄수 있는 메소드를 제공한다.
for x in os.walk("C:/Users/Hwan/Desktop/Find_TMP"):
print(x)
하위 디렉토리까지 모든 경로를 찾고 싶을 땐 os.walk 메소드를 쓰도록 하자!
'프로그래밍 > Python' 카테고리의 다른 글
FastAPI (0) | 2023.01.12 |
---|---|
[Python] 디렉토리 내부의 동일한 파일 찾기 (1) | 2022.12.10 |
[Python] Docstring (0) | 2022.11.27 |
[python] JWT 모듈 (0) | 2022.09.13 |
[Python] Yahoo_fin 모듈 (0) | 2022.09.11 |
[Python] Paramiko 모듈 (0) | 2022.07.07 |
댓글