ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 특정 디렉터리 및 하위 디렉터리에서 파일을 탐색하며 조건에 따라 파일 정보를 출력
    PYTHON(파이썬)/파이썬 활용 2024. 11. 14. 06:21
    728x90
    반응형

    특정 드라이브의 하위 폴드를 탐색하여 생성(수정)일자 기준으로 작성된 파일을 찾는 소스입니다. 

    특정일 기준으로 백업용 솔루션 만들때 테스트로 작성한 소스입니다. 

    import os
    from datetime import datetime

    #하위
    def search(dirname):
        filenames = os.listdir(dirname)
        for filename in filenames:
            full_filename = os.path.join(dirname, filename)
            print(full_filename)

    #Full-> .py
    def search2(dirname):
        try:
            filenames = os.listdir(dirname)
            for filename in filenames:
                full_filename = os.path.join(dirname, filename)
                if os.path.isdir(full_filename):
                    search2(full_filename)
                else:
                    ext = os.path.splitext(full_filename)[-1]
                    if ext == '.py':
                        print(full_filename)
        except PermissionError:
            pass

    #search2("c:/")
    #search("c:/data")

    # Full
    for (path, dir, files) in os.walk("e:/"):
        for filename in files:
            sdate = datetime.fromtimestamp(os.path.getmtime(path + str("/")+ filename)).strftime('%Y-%m-%d')
            stime = datetime.fromtimestamp(os.path.getmtime(path + str("/")+ filename)).strftime('%H:%M:%S')
            ext = os.path.splitext(filename)[-1]
            #if ext == '.exe':
            #    print("%s/%s" % (path, filename))
            if sdate == '2023-08-08':
                print(sdate, stime)
                print(path + str("/")+ filename)

    이 코드에서는 특정 디렉터리 및 하위 디렉터리에서 파일을 탐색하며 조건에 따라 파일 정보를 출력합니다. 코드의 주요 기능과 흐름을 분석하겠습니다.

    ### 1. 주요 함수 설명
    #### `search(dirname)`
    - 주어진 디렉터리 (`dirname`) 내의 파일과 폴더를 나열합니다.
    - `os.listdir(dirname)`를 사용하여 디렉터리 안의 모든 파일 및 폴더의 이름을 가져옵니다.
    - 각 파일 및 폴더의 경로를 `os.path.join(dirname, filename)`를 사용하여 출력합니다.
    - 하위 디렉터리로는 재귀적으로 들어가지 않고, 입력한 디렉터리 바로 아래만 탐색하는 간단한 함수입니다.

    #### `search2(dirname)`
    - 주어진 디렉터리 (`dirname`) 내 모든 파일을 재귀적으로 탐색하며 `.py` 파일을 출력하는 함수입니다.
    - `os.listdir()`로 파일과 폴더를 나열하고, `os.path.isdir(full_filename)`을 사용해 해당 경로가 디렉터리인지 확인합니다.
    - 만약 디렉터리라면 재귀 호출을 통해 하위 디렉터리를 탐색합니다.
    - 파일일 경우 확장자를 `.py`와 비교하고, 맞다면 파일 경로를 출력합니다.
    - `PermissionError` 예외처리를 사용하여 접근 권한이 없는 디렉터리 접근 시 프로그램이 멈추는 것을 방지합니다.

    ### 2. `os.walk()`을 사용한 전체 디렉터리 탐색
    - `os.walk("e:/")`를 사용하여 특정 드라이브(`e:/`) 내 모든 파일 및 디렉터리를 탐색합니다.
    - `os.walk()`는 주어진 경로 내의 모든 폴더를 순회하며, `path`, `dir`, `files` 정보를 제공합니다.
      - `path`: 현재 탐색 중인 폴더의 경로
      - `dir`: 현재 폴더 내의 서브 디렉터리들
      - `files`: 현재 폴더 내의 파일들
    - 각 파일에 대해:
      - 파일의 수정 날짜와 시간을 `datetime.fromtimestamp()`를 사용해 가져옵니다.
        - `os.path.getmtime()`를 사용해 파일의 수정 시간을 Unix 타임스탬프로 가져온 뒤, 이를 `datetime` 형식으로 변환합니다.
        - 날짜는 `%Y-%m-%d`, 시간은 `%H:%M:%S` 형식으로 변환합니다.
      - 파일의 확장자를 `os.path.splitext()`로 가져옵니다.
    - 특정 조건에 따라 (`sdate == '2023-08-08'`) 파일의 경로와 수정 시간을 출력합니다.

    ### 3. 코드의 기능 흐름
    - 코드의 마지막 부분에서 전체 파일 탐색을 위한 루프가 있습니다.
      - `os.walk("e:/")`를 사용하여 `e:/` 드라이브의 모든 디렉터리를 탐색하며 파일 목록을 처리합니다.
      - 각 파일에 대해 수정 날짜가 '2023-08-08'인 경우 해당 파일의 날짜, 시간, 그리고 경로를 출력합니다.

    ### 4. 코드의 용도와 활용
    - 이 코드는 파일 탐색 및 조건에 따라 특정 파일을 필터링하는 기능을 수행합니다.
    - 각 파일의 수정 날짜를 확인하고 특정 날짜와 일치하는 파일을 출력하는데, 이 기능은 특정 날짜에 수정된 파일을 찾는 데 유용합니다.
    - `.py` 확장자를 탐색하는 `search2()`는 Python 스크립트 파일을 찾을 때 사용합니다.
    - 코드는 기본적으로 디렉터리 내의 모든 파일을 재귀적으로 순회하며 특정 조건을 만족하는 파일을 찾고 그 경로를 출력하는 구조입니다.

    ### 5. 개선점 및 주의사항
    - 현재 코드는 모든 드라이브나 디렉터리를 탐색하고자 할 때 시간이 오래 걸릴 수 있습니다. 특히 `os.walk("e:/")`는 매우 많은 파일과 폴더를 순회하게 되므로 속도 문제를 야기할 수 있습니다.
    - 접근 권한 문제로 `PermissionError`가 발생할 수 있는 디렉터리가 많다면 예외 처리가 많이 발생하게 되어 성능이 저하될 가능성이 있습니다.
    - 코드의 안정성과 실행 시간을 고려하여, 큰 디렉터리를 탐색하는 경우에는 예외 처리가 필요하거나 특정 하위 디렉터리를 제외할 수 있는 로직이 필요합니다.
      
    ### 6. 요약
    - 코드의 전체 기능은 주어진 디렉터리(혹은 드라이브)를 탐색하면서 파일 경로, 확장자, 수정 날짜 등을 기반으로 특정 조건에 맞는 파일을 출력하는 것입니다.
    - 탐색 중 재귀 호출 및 권한 오류 예외 처리를 통해 모든 폴더를 깊게 탐색할 수 있도록 설계되어 있습니다.
      
    이와 같은 코드는 파일 관리 도구, 로그 검색 도구 등을 만들 때 유용하게 활용될 수 있습니다.

    728x90
Designed by Tistory.