Python 파일, 폴더 용량 취득 scandir() 사용 방법

파이썬 표준 라이브러리인 os를 사용해서 파일 사이즈 또는 폴더 안에 있는 파일을 포함한 폴더 사이즈를 취득하는 방법을 보겠습니다.

  

파일 사이즈 취득

파일 용량은 os.path.getsize()를 사용해 취득할 수 있습니다.

import os

print(os.path.getsize('tmp/src/img.png'))

 

결과

120652

 

파일 용량을 취득하고 싶은 파일과 파일이 있는 경로를 지정해 줍니다.

 

폴더 사이즈 취득

폴더 용량은 os.scandir()을 사용해 취득할 수 있습니다.

os.scandir()을 사용하면 폴더 안에 있는 파일을 포함한 폴던 전체 사이즈를 취득할 수 있습니다.

import os
def get_dir_size(path='.'):
    total = 0
    with os.scandir(path) as it:
        for entry in it:
            if entry.is_file():
                total += entry.stat().st_size
            elif entry.is_dir():
                total += get_dir_size(entry.path)
    return total

print(get_dir_size('tmp/src'))

 

결과

453736

 

os.scandir()은 os.DirEntry 오브젝트 이터레이터를 반환합니다.

is_file(), is_dir() 메서드를 사용해서 파일인지 폴더인지 판단해, 파일일 경우에는 start_result 오브젝트에 있는 st_size 속성으로 사이즈를 취득합니다.

폴더인 경우에는 함수를 다시 호출하여 모든 파일의 사이즈의 합계를 구해 반환합니다.

폴더 용량을 취득하는 함수에 파일을 설정하게 되면 에러가 발생합니다.

파일을 지정하거나 폴더를 지정해도 에러가 발생하지 않고 용량을 취득하고 싶은 경우에는 지정한 내용이 파일인지 폴더인지 판정하는 분기를 추가해 주면 됩니다.

import os
def get_dir_size(path='.'):
    total = 0
    with os.scandir(path) as it:
        for entry in it:
            if entry.is_file():
                total += entry.stat().st_size
            elif entry.is_dir():
                total += get_dir_size(entry.path)
    return total

def get_size(path='.'):
    if os.path.isfile(path):
        return os.path.getsize(path)
    elif os.path.isdir(path):
        return get_dir_size(path)

print(get_size('tmp/src'))
# 453736

print(get_size('tmp/src/img.png'))
# 120652

 

결과

453736
120652

 

get_size 함수에서는 파일이면 get_size()를 호출하고 폴더이면 get_dir_size()를 호출합니다.

파일을 지정하든 폴더를 지정하든 사이즈를 취득할 수 있게 됩니다.

 

파이썬 3.4 이전 버전

os.scandir()은 파이썬 3.5 버전부터 사용 가능합니다.

이전 버전에서는 os.listdir()을 사용해 작성해야 합니다.

import os
def get_dir_size_old(path='.'):
    total = 0
    for p in os.listdir(path):
        full_path = os.path.join(path, p)
        if os.path.isfile(full_path):
            total += os.path.getsize(full_path)
        elif os.path.isdir(full_path):
            total += get_dir_size_old(full_path)
    return total

print(get_dir_size_old('tmp/src'))

 

결과

453736

 

기본적인 사용방법은 os.scandir()과 같습니다.

예제에서 사용한 함수에 파일 경로를 지정하면 에러가 발생합니다.

os.scandir() 샘플에서 작성한 것처럼 지정한 경로가 파일인지 폴더인지 판단해 주는 분기를 만들면 파일 경로를 지정하든 폴더 경로를 지정하든 사이즈를 취득할 수 있습니다.

 

댓글