ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [python] 파일 목록 얻는 방법 - 영상 설명 (glob / os.walk)
    Python 2022. 4. 9. 17:44

    들어가며:

    데이터 사이언티스트나, 로그 관리할 때 등등 관리하고 있는 폴더 안의 파일 목록을 얻어야할 경우가 많습니다.

    파일 이름의 규칙을 알고 있다면 그 규칙에 따라서 문자열 리스트를 만들면 됩니다만..

    파일 이름 규칙은 모르는 상태에서 그냥 폴더 안의 모든 파일 목록을 가져오고 싶을 수도 있습니다.

     

    폴더 안의 파일 목록을 얻어오려면 어떻게 해야 할까요?

    영상 설명은 포스트 맨 아래를 확인해주세요.

    코드 설명:

    코드는 Codes 폴더에 있고,
    files_ 폴더 안에 있는 파일 목록을 얻고 싶은 상황입니다.

     

    아래 code는 files_ 폴더 안의 모든 파일명을 가져오는 코드입니다.

    from glob import glob
    
    file_list = glob("files_/*")
    print(file_list)

    [line 1]에서 glob이라는 파이썬 내장 라이브러리에서 파일 목록을 얻어올 수 있는 glob 함수를 import해옵니다.

    [line 3]에서 glob 함수를 이용해서 files_ 폴더 안의 파일들이 들어있는 목록을 얻어왔습니다.

     

    glob("files_/*")의 의미는,

    files 폴더 안의 ( files/ )
    모든 파일을 가져오겠다. (*)

    입니다.

    regex(정규 표현식)을 알고 있다면, 정규 표현식으로 파일명 필터링을 하실 수 있습니다

    (정확히는 regex와 같은 문법을 지원하는 건 아니지만, 간단한 규칙에 대해서는 거의 같습니다).

    위 코드에서 [line 4]까지 실행한 결과는 아래와 같습니다.

    glob함수 결과

    폴더의 모든 파일이 포함돼있는 것을 확인하실 수 있습니다.

    만일 위 파일들 중에서 ~~~0.jpg로 끝나는 파일명만 가져오고 싶다면,

    glob("files/*0.jpg")

    로 규칙을 주시면, 아래와 같이 0으로 끝나는 .jpg파일만 들어있는 list를 얻을 수 있습니다.

    이 방식을 사용하면 특정 폴더 아래에서 모든 파일을 가져올 수도 있고, 어떤 규칙을 만족하는 파일만 따로 추려올 수도 있습니다.

     

    그런데 이 방식은 한계가 있습니다.

    폴더 안에 폴더가 있고 폴더 중간중간에 파일들이 있는 복잡한 구조라면 어떨까요?

    glob은 "어떤 폴더 안의" 파일 리스트를 받기 편하게 설계돼있기 때문에 폴더명과 어느 정도 깊이 들어갈지를 먼저 명시해야하지만, 폴더의 깊이도 알 수 없는 경우도 있을 수 있습니다.

    폴더 깊이까지 복잡한 구조에서 파일 리스트를 얻을 땐, os.walk를 쓰시면 됩니다.

     

    아래 구조처럼 files_ 폴더 안에 파일들이 각각 들어있는 폴더가 3개 있는 상황이면 어떨까요?

    glob을 쓰면

    glob("file1/*") + glob("file2/*") + glob("file3/*")

    로 코딩할 순 있겠으나, 폴더 수도 모르고, 폴더 이름이 불규칙적이기까지 하면 더 복잡해집니다.

    이 상황에선 os.walk를 아래와 같이 사용할 수 있습니다.

     

    import os
    
    file_list = []
    for parent, _, files in os.walk("files_"):
        for f in files:
            file_list.append(os.path.join(parent, f))
    
    print(file_list)

    [line 1]에서는 파이썬 내장 라이브러리인 os를 import합니다.

    [line 3]에서는 파일명 목록을 담을 file_list 리스트를 선언합니다.

    os.walk는 폴더 단위로 한 번씩 훑어보는 행위를 반복합니다.

    os.walk의 첫 번째 인자(parent)는 각 반복별로 보고있는 폴더입니다.

    os.walk의 두 번째 인자(_)는 parent 폴더 안에 있는 폴더들의 리스트입니다.

    os.walk의 세 번째 인자(files)는 parent 폴더 안에 있는 파일들의 리스트입니다.

     

    [line 4]: 이중 for문 중에서 바깥의 for문은 시작 폴더 안에 있는 모든 폴더를 각각 보게 하는 반복문입니다.

    [line 5]: 이중 for문 중에서 안쪽의 for문은 각 폴더 안에서 존재하는 파일들에 각각 접근시키는 반복문입니다. 

    [line 6]: 마지막 들여쓰기에서 file_list에 지금 보고 있는 폴더와, 파일명을 합쳐서 모든 파일명에 대해서 각각 os.path.join으로 합친 뒤 list에 추가합니다.

     

    위 코드를 실행하면 아래처럼 모든 폴더의 파일명이 담긴 list를 구할 수 있습니다.

    코드가 어떻게 동작하는지에 대한 상세한 설명은 아래 영상을 참고해주세요.

     

    https://www.youtube.com/watch?v=JzLIDbgLCRQ 

     

    댓글

Designed by Tistory.