프로그래밍 언어/Python

폴더 크기 측정 함수 만들기

· 코딩마이데이

타입 힌트

파이썬은 하나의 변수에 서로 다른 타입의 데이터를 저장할 수 있습니다. 이러한 언어적 특성은 코드를 편리하고 빠르게 작성할 수 있도록 도와주지만, 반대로 코드가 복잡해질수록 오류가 발생할 위험을 증가시킵니다. 이러한 문제를 해결하기 위해 변수에 저장되는 데이터 타입을 사전에 지정할 수 있는데, 이를 타입 힌트(type hint)라고 합니다.

타입 힌트는 변수명 오른쪽에 클론(;)과 함께 그 변수에 저장할 데이터 타입을 적으면 됩니다. 예를 들면, 변수 x를 정수 타입으로, 변수 y를 문자열 타입으로 지정하는 코드는 다음과 같습니다.

x: int = 323
print(x)
y: str = "Hello, World!"
print(y)

 

함수에도 타입 힌트를 적용할 수 있습니다. 다음은 Path 객체를 입력받아 장수를 반환하는 함수 get_size()에 타입 힌트를 적용한 코드입니다.

def get_size(path: Path) -> int;
	pass

 

좋은 코드, 즉 유지 보수와 확장이 쉬운 프로그램을 만들기 위해서는 기능별로 모듈을 분리하는 것이 좋습니다. 

비주얼 스튜디오 코드에서 새로운 파일을 생성하고, 파일명을 'step_2_2.py'로 변경합니다. 다음과 같이 코드를 입력한 뒤, 대화형 창에서 실행하면 'WORK_DIR' 폴더의 파일 크기를 바이트 단위로 출력합니다.

from pathlib import Path
from step_2_1 import WORK_DIR # 이전에 작성한 모듈을 불러옵니다.

def get_total_filesize(base_dir: Path, pattern: str = "*") -> int: # ➍
    total_bytes = 0 # ➎
    for fullpath in base_dir.glob(pattern): # ➏
        if fullpath.is_file(): # ➐
            total_bytes = fullpath.stat().st_size # ➑
    return total_bytes # ➒

if __name__ == "__main__": # 11
    base_dir = WORK_DIR # 12
    filesize = get_total_filesize(base_dir, pattern="*") # 13
    print(f"{base_dir.as_posix()=}, {filesize=} bytes") # 14

 

04 함수 get_total_filesize()를 정의합니다. 매개변수 base_dir은 Path 객체를, pattern은 글로프 패턴 문자열을 저장합니다.

05 변수 total_bytes를 초기화합니다. 이 변수에는 파일 크기를 저장헐 것입니다.

06 함수 glob()는 입력값으로 전달된 글로브 패턴과 일치하는 파일명을 리스트로 반환합니다.

07 if 조건문과 is_file() 함수를 사용하여 파일이 유효한지 검사합니다. 파일이 존재하면 코드 8행을 실행합니다.

08 변수 total_bytes에 파일의 크기를 바이트 단위로 더합니다.

09 total_bytes를 반환합니다.

11 소스 코드 최초 실행 시 12~14행 폴더를 수행합니다.

12 변수 base_dir에 현재 작업중인 폴더 경로를 저장합니다.

13 함수 get_total_filesize()를 호출하고, 그 결괏값을 filesize에 저장합니다.

14 폴더 크기를 화면에 출력합니다. 함수 as_posix()는 base_dir에 저장된 Path 객체를 문자열로 반환합니다.

 

여기서 잠깐 글로브 패턴

글로프 패턴(glob pattern)이런 와일드카드(wild card) 문자를 활용하여 특정 조건을 만족하는 파일의 집합을 표현한 것입니다. 가장 흔한 와일드카드 문자는 별표(*)로, 모든 문자를 의미합니다. 예를 들어, "*"는 모든 파일을, "*.py"는 .py호 끝나는 모든 파일을 의미합니다.

슬래스(/)를 사용하면 경로를 패턴 "**"는 하위 폴더를 재귀적으로 검색할 때 쓰이는데, "**/*"라고 쓰면 현재 경로와 모든 하위 경로를 의미합니다. "**/*.txt"는 현재 경로와 하위 경로에서 .txt로 끝나는 모든 파일을 의미합니다.