728x90
반응형

디렉토리 탐색

 모든 하위 디렉토리 내부 파일까지 포함된 전체 파일의 목록을 가져오기 위해 파이썬으로 코드를 작성하려고 한다.

그런데 디렉토리(또는 폴더) 내부에 하위 디렉토리가 있다면?

그리고 그 디렉토리 내부에 하위 디렉토리가 있는지 없는지 모른다면?

코드를 어떻게 작성해야 될까?

 

먼저 파이썬에서 경로를 다루기위해  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 메소드를 쓰도록 하자!

 

728x90
반응형

'프로그래밍 > 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

+ Recent posts