Appia의 IT세상

파이썬[Python] 특정 경로에 있는 모든 파일과 디렉토리 출력하기(os.walk) 본문

Python/Python 응용

파이썬[Python] 특정 경로에 있는 모든 파일과 디렉토리 출력하기(os.walk)

Appia 2020. 5. 25. 07:37
반응형

이번에는 특정 폴더의 모든 파일과 디렉토리를 출력하는 방법에 대해서 살펴보고자 합니다. 앞서서 파일인지 디렉토리인지 확인 하는 방법을 가졌살펴봤습니다. 물론, 그 방법을 통해서도 모든 파일을 출력하는 방법이 있고, 여기서 관련해서 다시한번 다루어 볼 것입니다. 

 

먼저, 다음을 진행하기 앞서서, 테스트를 위해서 다음과 같은 폴더와 파일들을 임의적으로 만들었습니다. 

테스트 폴더 

물론 이 파일 폴더는 PythonTest 폴더 밑에 각각 폴더들을 구비 했습니다. 그리고 각 폴더는 Path_1에는 File_1.dbc, Path_2에는 File_2 형태로 파일을 하나씩 넣어 놨습니다. 그럼 이부분을 바탕으로 모든 파일을 출력하는 부분에 대해서 만들어 보겠습니다. 

다음 포스팅에선 간단히 폴더 안에 존재하는 파일과 디렉토리를 출력하도록 해봤었습니다. 이 부분을 응용하도록 하겠습니다. 

불러오는 중입니다...

 

그럼 그럼 위의 포스팅에서 사용한 코드를 살짝 수정하여 다음과 같은 코드를 작성해봤습니다.

example)

import os
 
import os.path
 
def print_file(dir):
 
    files = os.listdir(dir)
    
    for item in files :
    
        if os.path.isdir(dir+r"\\"+item) == True :
        
            print_file(dir+r"\\"+item)
            
        else:
        
            print(dir+r"\\"+item)
 
if __name__ == '__main__':
 
    dir = r"D:\PythonTest"
    
    print_file(dir)
cs

위의 코드를 보면 디렉토리일 경우 재귀하여 결론적으로는 상위 폴더를 하나 정하고, 하위에 모든 폴더 구조에 있는 파일들을 경로와 함꼐 표시하도록 했습니다. 위의 코드를 실행하니 다음과 같이 출력이 됩니다. 

result) 

D:\PythonTest\\File_0.dbc
 
D:\PythonTest\\Path_1\\File_1.dbc
 
D:\PythonTest\\Path_1\\Path_1_1\\File_1_1.dbc
 
D:\PythonTest\\Path_2\\File_2.dbc
 
D:\PythonTest\\Path_2\\Path_2_1\\File_2_1.dbc
 
D:\PythonTest\\Path_3\\File_3.dbc
 
D:\PythonTest\\Path_3\\Path_3_1\\File_3_1.dbc
cs

위와 같은 방법으로 하는 것도 매우 괜찮은데, 관련해서 특정 os모듈에 관련된 함수가 있습니다. 그럼 한번 살펴보겠습니다. 

 

currentfolder, dirs, files =os.walk(path)

 

currentfolder - 현재 확인하는 폴더의 이름을 출력해줍니다. 

dirs - 현재 디렉토리에서 하위 디렉토리 이름에 대해서 리스트 형태로 리턴해줍니다. 

files - 현재 디렉토리에서 파일 이름를 리턴해줍니다. 

 

그럼 한번 실행해보도록 하겠습니다. 

example) 

import os
 
for currentdir, dirs, files in os.walk(r"D:\PythonTest"):
 
    for file in files :
    
        print(currentdir)
        
        print(dirs)
        
        print(file)
cs

 

위의 예제를 실행해보니, 다음과 같은 결과가 나옵니다. 

D:\PythonTest
 
['Path_1''Path_2''Path_3']
 
File_0.dbc
 
D:\PythonTest\Path_1
 
['Path_1_1']
 
File_1.dbc
 
D:\PythonTest\Path_1\Path_1_1
 
[]
 
File_1_1.dbc
 
D:\PythonTest\Path_2
 
['Path_2_1']
 
File_2.dbc
 
D:\PythonTest\Path_2\Path_2_1
 
[]
 
File_2_1.dbc
 
D:\PythonTest\Path_3
 
['Path_3_1']
 
File_3.dbc
 
D:\PythonTest\Path_3\Path_3_1
 
[]
 
File_3_1.dbc
cs

원래는 약간 수정해서 위와 동일한 결과를 만들어볼려고 했는데, os.walk의 반환되는 값들에 대해서 알고 있으면 좋을 것 같아서 다음과 같이 풀어서 작성을 했습니다. 그럼 위와 유사한 형태가 나오도록 조금 코드를 수정해보겠습니다. 

 

import os
 
for currentdir, dirs, files in os.walk(r"D:\PythonTest"):
 
    for file in files :
    
        print(currentdir+r"\\"+file)
cs

위의 코드를 수정해서 실행하면 다음과 같은 결과가 나옵니다. 

 

D:\PythonTest\\File_0.dbc
 
D:\PythonTest\Path_1\\File_1.dbc
 
D:\PythonTest\Path_1\Path_1_1\\File_1_1.dbc
 
D:\PythonTest\Path_2\\File_2.dbc
 
D:\PythonTest\Path_2\Path_2_1\\File_2_1.dbc
 
D:\PythonTest\Path_3\\File_3.dbc
 
D:\PythonTest\Path_3\Path_3_1\\File_3_1.dbc
cs

 

코드의 양도 훨씬 줄어들고 편해지는 것을 알 수 있습니다. 이런 부분을 바탕으로해서 파일 찾기등을 구현해보는 것은 어떨까 합니다. 혹 궁금하신 점이나 문의 사항 있으시면 언제든지 댓글 및 방명록에 글 남겨주시길 바랍니다. 감사합니다. 

반응형
Comments