파이썬에서 파일 및 폴더 크기 확인하기
이 글에서는 파이썬(Python)을 사용하여 파일이나 폴더의 크기를 알아내는 다양한 방법을 살펴봅니다. 파이썬은 그 유연성으로 인해 간단한 명령 줄 인터페이스(CLI) 프로그램부터 복잡한 웹 애플리케이션까지 다양한 개발에 활용됩니다.
파이썬의 강력한 기능 중 하나는 운영 체제와의 상호 작용 능력입니다. 파이썬으로 OS 작업을 관리함으로써 자동화 프로세스를 구축할 때 많은 시간을 절약할 수 있습니다.
파이썬과 운영 체제의 상호 작용
우리는 운영 체제와 격리된 환경에서 작업할 수 없습니다. 파이썬도 예외는 아니며, 때로는 작업을 수행하기 위해 운영 체제와 상호 작용해야 합니다.
파이썬은 운영 체제와 상호 작용할 수 있는 다양한 모듈을 제공합니다. 그 중 가장 자주 사용되는 것은 os, sys, pathlib 및 subprocess 모듈입니다.
이러한 모듈들은 파이썬에 내장되어 있으므로 별도로 설치할 필요 없이 다음과 같이 import하여 사용할 수 있습니다.
import os import sys import pathlib import subprocess
각 모듈의 주요 기능은 다음과 같습니다.
- os: 운영 체제에 따라 달라지는 시스템별 기능을 제공하며, 대부분의 경우 유용하게 사용됩니다.
- sys: 파이썬 인터프리터 관련 변수 및 함수에 접근할 수 있도록 합니다. os 모듈이 운영 체제와 상호 작용하는 데 비해, sys 모듈은 파이썬 인터프리터 자체와 상호 작용합니다.
- pathlib: 파일 시스템 경로를 객체로 나타내어 경로를 보다 효율적으로 처리할 수 있도록 합니다.
- subprocess: 파이썬에서 직접 하위 프로세스를 실행하고 관리할 수 있게 합니다. 이를 통해 stdin, stdout 및 반환 코드와 같은 프로세스 관련 작업을 수행할 수 있습니다.
물론, 더욱 세분화된 기능을 제공하는 고급 라이브러리도 있지만, 대부분의 경우 위에서 언급한 기본 모듈만으로도 충분합니다.
주의: 위 모듈들이 제공하는 기능은 운영 체제에 따라 결과가 다를 수 있습니다. 일반적으로 유닉스 계열 운영 체제에서 파이썬이 더 일관된 결과를 보여줍니다.
이제 파이썬이 운영 체제와 어떻게 상호 작용하는지 간략히 살펴보았으니, 파일 및 폴더 크기를 확인하는 방법에 대해 자세히 알아보겠습니다. 아래에서 소개하는 모든 코드는 파이썬 파일 및 폴더 크기 GitHub 저장소에서 확인하실 수 있습니다.
os.stat().st_size를 이용한 파일 크기 확인
이 방법에서는 os 모듈의 stat() 함수를 사용합니다. 이 함수는 주어진 경로에 대한 다양한 정보를 반환하며, 파일 크기를 얻을 수 있는 st_size 속성을 포함하고 있습니다.
참고: os.path.getsize() 함수도 동일한 작업을 수행하지만, os.stat().st_size의 장점은 심볼릭 링크를 따라가지 않는다는 점입니다.
먼저, lorem.txt라는 이름의 테스트 파일을 만들고 임의의 텍스트를 추가합니다. Lorem Ipsum 텍스트 생성기를 사용하여 텍스트를 생성하고 lorem.txt 파일에 붙여넣을 수 있습니다.
이제 method1.py 파일을 생성하고 다음 코드를 입력합니다.
import os size = os.stat('lorem.txt').st_size print(size)
이 코드가 하는 일은 다음과 같습니다.
- 첫 번째 줄에서 os 모듈을 가져옵니다.
- size 변수에 lorem.txt 파일의 크기를 저장합니다.
- os.stat() 함수는 파일 관련 정보를 반환합니다.
- st_size 속성은 파일의 크기를 바이트 단위로 나타냅니다.
- size 변수에 저장된 파일 크기를 출력합니다.
파이썬 스크립트를 실행하면 lorem.txt 파일의 내용에 따라 다른 결과가 출력됩니다.
예시 출력:
20064
출력 결과는 바이트 단위로 표시됩니다. 따라서, 결과를 사람이 읽기 쉬운 형태로 변환해 보겠습니다.
먼저, humanize 패키지를 설치합니다. 터미널에서 다음 명령을 실행합니다.
pip install humanize
이제, 바이트 값을 KB, MB, GB, TB 등의 사람이 읽을 수 있는 단위로 변환하는 naturalsize() 함수를 사용할 수 있습니다.
import os from humanize import naturalsize size = os.stat('lorem.txt').st_size print(size) print(naturalsize(size))
위 코드는 먼저 파일 크기를 바이트 단위로 출력한 다음, 사람이 읽을 수 있는 형식으로 출력합니다.
예시 출력:
20064 20.1 kB
Pathlib 모듈 활용
pathlib 라이브러리는 경로 조작에 특화되어 있으며, 다른 모듈의 유용한 기능을 Path 객체(Path 클래스의 인스턴스)의 메소드로 통합합니다.
method2.py 파일을 만들고 Path 클래스를 사용해 보겠습니다.
from pathlib import Path
다음으로, lorem.txt 파일의 경로를 인자로 사용하여 Path 객체를 생성합니다.
file_ = Path('lorem.txt')
이제 Path 클래스의 stat() 메소드를 사용하여 파일 크기를 얻을 수 있습니다. 이 메소드는 os.stat()과 동일하게 작동하므로 파일 크기를 출력할 수 있습니다.
print(file_.stat().st_size)
예시 출력:
20064
보시다시피, 첫 번째 방법과 동일한 결과가 출력됩니다. 이 결과도 바이트 단위이므로, humanize 모듈을 사용하여 사람이 읽을 수 있는 형태로 변환할 수 있습니다.
from pathlib import Path from humanize import naturalsize size = Path('lorem.txt').stat().st_size print(naturalsize(size))
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
20.1 kB
subprocess 모듈과 Unix 명령어 사용
subprocess 모듈을 사용하면 파이썬에서 하위 프로세스를 호출하고 관리할 수 있습니다. 이를 통해 Unix 명령어를 직접 실행하고, 그 결과를 파이썬에서 처리할 수 있습니다.
참고: 이 방법은 유닉스 계열 운영 체제(Linux, Mac)에서만 작동합니다.
method3.py 파일을 생성하고 다음 코드를 붙여넣습니다.
from subprocess import run process = run(['du', 'lorem.txt'], capture_output=True, text=True) print(process.stdout)
코드를 살펴보면 다음과 같습니다.
- subprocess 모듈의 run 함수를 사용합니다.
- process 변수에 `du lorem.txt` 명령을 실행한 결과를 저장합니다.
- `du`는 파일의 디스크 사용량을 확인할 수 있는 Linux 유틸리티입니다.
- `capture_output=True`는 명령의 표준 출력에 접근할 수 있도록 합니다.
- `text=True`는 출력을 바이트열 대신 문자열로 저장합니다.
- 표준 출력을 출력합니다.
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
20 lorem.txt
결과에서 파일 크기와 파일 이름이 함께 표시됩니다. 파일 크기만 얻으려면, 출력을 공백으로 분할하고 첫 번째 요소를 출력해야 합니다.
from subprocess import run process = run(['du', 'lorem.txt'], capture_output=True, text=True) size = process.stdout.split()[0] print(size)
예시 출력:
20
이 출력 결과는 사람이 읽기에 불편합니다. 결과값이 KB 단위라는 것을 추측할 수 있지만(이전 방법 때문에), 파일 크기를 명확히 알기는 어렵습니다.
이 문제를 해결하기 위해, `-h` (사람이 읽을 수 있는) 플래그를 사용할 수 있습니다.
참고: `man du` 또는 `du –help` 명령을 사용하여 해당 명령에 대한 설명을 볼 수 있습니다.
from subprocess import run process = run(['du', '-h', 'lorem.txt'], capture_output=True, text=True) size = process.stdout.split()[0] print(size)
이제 스크립트의 출력이 훨씬 더 읽기 쉽습니다.
20K
subprocess 모듈 및 활용법에 대해 더 알고 싶다면, 파이썬 subprocess 가이드 문서를 참조하시기 바랍니다.
폴더 크기 재귀적으로 확인하기
폴더 크기를 얻으려면 디렉토리와 하위 디렉토리의 각 파일을 반복해야 합니다. 이 작업은 다음 두 가지 방법으로 수행할 수 있습니다.
- pathlib를 사용하여 경로 반복
- subprocess 모듈과 `du` 명령 사용
다음 코드는 내 홈 폴더 내의 테스트 디렉토리 경로를 사용합니다. 실제 사용할 경로로 수정해야 합니다.
pathlib를 사용하여 경로 반복
파일 크기를 반복하여 디렉토리 크기를 얻는 방법을 살펴보겠습니다.
from pathlib import Path from humanize import naturalsize def get_size(path="."): size = 0 for file_ in Path(path).rglob('*'): size += file_.stat().st_size return naturalsize(size) test_path = Path.home() / 'Documents/tests/' print(get_size(test_path))
코드가 복잡해 보일 수 있으므로, 각 부분을 분석해 보겠습니다.
- Path 클래스와 naturalsize() 함수를 가져옵니다.
- 기본적으로 현재 디렉토리를 가리키는 매개변수 `path`를 사용하여 `get_size()` 함수를 정의합니다.
- `size` 변수는 각 파일 크기를 합산할 변수입니다.
- 경로 내의 각 파일을 반복합니다.
- 각 파일의 크기를 가져와서 `size` 변수에 누적합니다.
- 사람이 읽을 수 있는 형태로 변환된 `size` 변수를 반환합니다.
위 코드는 사용자 환경에 따라 경로를 변경해야 합니다.
내 환경에서 실행한 결과는 다음과 같습니다.
403.4 MB
subprocess 모듈과 `du` 명령 사용
이 접근 방식에는 다음과 같은 몇 가지 장점이 있습니다.
- 결과가 더 정확합니다.
- 더 빠릅니다.
from subprocess import run from pathlib import Path test_path = Path.home() / 'Documents/tests/' process = run(['du', '-sh', test_path], capture_output=True, text=True) size = process.stdout.split()[0] print(size)
이전과 동일한 방식으로 접근하되, 파일 대신 디렉토리 크기를 얻는다는 점만 다릅니다.
예시 출력:
481M
폴더 크기를 가져오는 두 가지 방법을 살펴보았듯이, 결과에 약간의 차이가 있음을 알 수 있습니다. 디렉토리가 클수록 차이가 더 커질 수 있습니다.
pathlib 또는 subprocess 방식을 선택하는 것은 사용자에 달려 있습니다. subprocess 모듈을 사용할 때는 Linux를 사용하고 있는지 확인하는 것이 좋습니다.
정리하자면
파이썬은 운영 체제와 상호 작용할 때 매우 편리한 도구입니다. 파이썬을 사용하여 프로세스를 자동화하고 상당한 시간을 절약할 수 있습니다. 운영 체제와 상호 작용하기 위한 주요 모듈은 os, sys, path, subprocess입니다.
본 튜토리얼에서는 다음 사항을 살펴보았습니다.
- 파이썬이 운영 체제와 상호 작용하는 방법
- 운영 체제 작업을 위한 내장 모듈 사용 방법
- humanize 모듈을 사용하여 결과를 읽기 쉽게 출력하는 방법
- 세 가지 다른 방법으로 파일 크기를 계산하는 방법
- 재귀적으로 또는 `du` 명령을 사용하여 디렉토리 크기를 계산하는 방법