프로그래밍 언어/Python

폴더 크기 측정하기

· 코딩마이데이

폴더의 크기를 측정하고 그 결과를 JSON 파일로 저장합니다. 홈 디렉터리를 기준 경로로 하기 때문에 실행 완료까지 시간이 걸릴 수 있습니다.

비주얼 스튜디오 코드에서 새로운 파일을 생성한 뒤 파일 명을 'step_2_4.py'로 변경합니다. 다음 코드를 입력한 뒤, 대화명 창에서 실행하면 'output' 폴더에 'step_2_4.json' 파일이 결과로 생성됩니다. 비주얼 스튜디오 코드에서 이 파일을 열면 폴더의 크기를 바이트 단위로 볼 수 있습니다.

import json
from pathlib import Path
from step_2_1 import OUT_DIR # 이전에 작성한 모듈을 불러옵니다.
from step_2_2 import get_total_filesize
from step_2_3 import load_dirnames

OUT_2_4 = OUT_DIR / f"{Path(__file__).stem}.json"

def dump_file_from_dirnames(): # 9
    dirs = load_dirnames() # 10
    result = {} # 11
    for path_str in dirs: # 12
        path = Path(path_str) # 13
        filesize = get_total_filesize(path, pattern="**/*") # 14
        result[path.as_posix()] = filesize # 15
    with open(OUT_2_4, "w", encoding="utf-8") as fp:
        json.dump(result, fp, ensure_ascii=False, indent=2)
    
def load_filesize_per_dir() -> dict[str, int]: # 19
    if OUT_2_4.is_file():
        with open(OUT_2_4, encoding="utf-8") as fp:
            return json.load(fp)
    return {}

if __name__ == "__main__":
    dump_file_from_dirnames() # 26

 

[실행 결과]

{
  "C:/Users/zzang/!!!#1(3965675)": 1048576,
  "C:/Users/zzang/.cache": 47,
  "C:/Users/zzang/.cf": 3599,
  "C:/Users/zzang/.codetogether": 170,
  "C:/Users/zzang/.config": 113,
  "C:/Users/zzang/.cursor": 2,
  "C:/Users/zzang/.docker": 685808,
  "C:/Users/zzang/.eclipse": 175,
  "C:/Users/zzang/.gradle": 2,
  "C:/Users/zzang/.idlerc": 0,
  "C:/Users/zzang/.ipython": 371,
  "C:/Users/zzang/.m2": 202,
  "C:/Users/zzang/.p2": 20747,
  "C:/Users/zzang/.skiko": 17315328,
  "C:/Users/zzang/.vscode": 35426,
  "C:/Users/zzang/.webclipse": 372080,
  "C:/Users/zzang/AndroidStudioProjects": 0,
  "C:/Users/zzang/AppData": 0,
  "C:/Users/zzang/Application Data": 0,
  "C:/Users/zzang/Contacts": 412,
  "C:/Users/zzang/Cookies": 0,
  "C:/Users/zzang/Documents": 43982336,
  "C:/Users/zzang/Downloads": 3146,
  "C:/Users/zzang/Favorites": 80,
  "C:/Users/zzang/IntelGraphicsProfiles": 8436,
  "C:/Users/zzang/Links": 902,
  "C:/Users/zzang/Local Settings": 0,
  "C:/Users/zzang/Mendix": 149,
  "C:/Users/zzang/Music": 5078341,
  "C:/Users/zzang/My Documents": 0,
  "C:/Users/zzang/NetHood": 0,
  "C:/Users/zzang/OneDrive": 387,
  "C:/Users/zzang/Oracle": 3867,
  "C:/Users/zzang/Postman": 0,
  "C:/Users/zzang/PrintHood": 0,
  "C:/Users/zzang/Recent": 0,
  "C:/Users/zzang/Saved Games": 282,
  "C:/Users/zzang/Searches": 852,
  "C:/Users/zzang/SendTo": 0,
  "C:/Users/zzang/Templates": 0,
  "C:/Users/zzang/Videos": 1213959679,
  "C:/Users/zzang/source": 0,
  "C:/Users/zzang/workspace": 1865,
  "C:/Users/zzang/시작 메뉴": 0
}

 

09 이전 단계에서 생성된 JSON 형식의 폴더 목록 파일을 불러와 폴더별로 파일 크기를 측정하고, 그 결과를 JSON 형식으로 OUT_2_4 경로에 저장하는 함수 dump_filesize_from_dirnames()를 정의합니다.

10 함수 load_dirnames()를 사용하여 폴더 목록을 불러와서 변수 dirs에 저장합니다.

11 딕셔너리result를 생성합니다. result에는 폴더 경로와 크기를 각각 키와 쌍으로 저장합니다.

12 dirs에 있는 폴더에 대해 반복 작업을 수행합니다.

13 path_str에 저장된 폴더 경로 문자열을 Path 객체로 변환하고 변수 path에 저장합니다.

14 변수 filesize에 폴더의 크기를 저장합니다. 이때 매개변수 pattern에 글로브 패턴 '**/*"에 전달해서 하위 폴더를 포함하여 모든 파일을 검색하도록 저장합니다.

19 OUT_2_4 경로에 저장된 폴더별 파일 크기 파일을 불러와서 딕셔너리로 반환하는 함수 load_filesize_per_dir()를 정의합니다.

26 dump_filesize_from_dirnames() 함수를 호출하여 홈 디렉터리 하위 폴더의 크기를 측정합니다.