Як перевірити розмір файлу та папки в Python?

Визначення Розміру Файлів та Папок за Допомогою Python

У цій публікації ми розглянемо методи, які дозволяють дізнатися розмір файлу або папки, використовуючи мову програмування Python.

Python відомий своєю універсальністю, дозволяючи розробляти як невеликі утиліти командного рядка, так і складні веб-застосунки.

Особливо корисна його здатність взаємодіяти з операційною системою, що робить його чудовим інструментом для автоматизації різноманітних процесів.

Давайте детальніше розглянемо, як саме Python взаємодіє з ОС.

Механізми Взаємодії Python з Операційною Системою

Кожна програма, так само як і людина, не може існувати в ізоляції. Часом взаємодія з операційною системою стає необхідністю для виконання певних завдань.

У Python є кілька модулів, які надають функціонал для таких операцій, зокрема os, sys, pathlib та subprocess.

Оскільки ці модулі є вбудованими, їх не потрібно встановлювати окремо через pip. Імпортувати їх можна наступним чином:

import os
import sys
import pathlib
import subprocess

Короткий опис функціоналу кожного модуля:

  • os: Забезпечує кросплатформний доступ до функцій операційної системи. Це стандартний вибір для більшості випадків, коли не потрібні складні операції.
  • sys: Дає доступ до системних параметрів і функцій інтерпретатора Python. На відміну від os, який працює з ОС, sys взаємодіє з інтерпретатором.
  • pathlib: Пропонує розширені можливості роботи зі шляхами, дозволяючи представляти їх як об’єкти з унікальною семантикою для різних ОС.
  • subprocess: Дозволяє виконувати та керувати підпроцесами безпосередньо з Python, забезпечуючи роботу з потоками введення/виведення та кодами повернення.

Існують також спеціалізовані бібліотеки високого рівня, які можуть знадобитися для особливих випадків, але для більшості завдань вищезгадані модулі є достатніми.

Важливо: Функціонал, що надається цими модулями, може відрізнятися залежно від вашої операційної системи. Слід пам’ятати, що Python найкраще сумісний з UNIX-подібними системами.

Отже, після розуміння основних принципів взаємодії Python з ОС, перейдемо до методів визначення розміру файлів та папок. Всі представлені нижче рішення можна знайти у репозиторії GitHub.

Використання os.stat().st_size

Цей метод використовує функцію stat() з модуля os, яка повертає детальну інформацію про вказаний шлях.

Зауважте, що os.path.getsize() також виконує подібну роботу, але os.stat().st_size не переходить за символічними посиланнями.

Спочатку створимо тестовий файл lorem.txt та наповнимо його випадковим текстом, наприклад з генератора Lorem Ipsum.

У цьому ж каталозі створіть файл method1.py з таким кодом:

import os
size = os.stat('lorem.txt').st_size
print(size)

Детальний розбір коду:

  • Імпортуємо модуль os.
  • Змінна size зберігає розмір файлу lorem.txt.
    • Функція os.stat() повертає різноманітну інформацію про файл.
    • Атрибут st_size вказує на розмір файлу в байтах.
  • Виводимо значення змінної size.

Виконайте скрипт Python, та ви побачите результат, що залежить від вмісту lorem.txt.

Приклад виводу:

20064

Розмір надається у байтах, що не дуже зручно для сприйняття. Для кращого розуміння перетворимо його на читабельний формат.

Для цього встановимо пакет humanize, виконавши у терміналі:

pip install humanize

Тепер використаємо функцію 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.

Створіть файл method2.py та імпортуйте клас Path:

from pathlib import Path

Створіть об’єкт Path, передавши шлях до файлу lorem.txt:

file_ = Path('lorem.txt')

Тепер можна використати метод stat() класу Path. Він працює аналогічно функції 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

Використання Команд Unix через subprocess

Модуль subprocess дозволяє виконувати підпроцеси та керувати ними з Python, що дозволяє запускати будь-які команди та обробляти їх вихід.

Зауваження: Цей метод працює лише в Unix-подібних ОС (Linux, macOS).

Створіть файл method3.py та вставте наступний код:

from subprocess import run

process = run(['du', 'lorem.txt'], capture_output=True, text=True)

print(process.stdout)

Розглянемо код детальніше:

  • Імпортуємо функцію run з модуля subprocess.
  • Змінна process зберігає результат виконання команди du lorem.txt.
    • du – це утиліта Unix для отримання інформації про використання дискового простору файлом.
    • capture_output дає доступ до стандартного виводу.
    • text вказує, що результат зберігається як рядок, а не байти.
  • Виводимо стандартний вивід процесу.

При запуску коду отримаємо:

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

Для покращення читабельності використаємо прапорець -h (human-readable):

from subprocess import run

process = run(['du', '-h', 'lorem.txt'], capture_output=True, text=True)

size = process.stdout.split()[0]

print(size)

Тепер вивід буде:

20K

Отримання Розміру Папки Рекурсивно

Для визначення розміру папки необхідно пройтися по всім файлам та підкаталогам. Розглянемо два способи:

  • Ітерація по шляху з pathlib.
  • Використання команди du з subprocess.

Далі ми будемо використовувати шлях до тестового каталогу. Вам потрібно буде замінити його на шлях до папки, розмір якої ви хочете дізнатися.

Ітерація з використанням 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().
  • Визначаємо функцію get_size() з параметром path, за замовчуванням вказує на поточний каталог.
  • Змінна size ініціалізується як 0, для додавання розмірів файлів.
  • Ітеруємо по кожному файлу в каталозі та його підкаталогах.
  • Отримуємо розмір кожного файлу та додаємо до змінної size.
  • Повертаємо розмір у читабельному форматі.

При запуску отримаємо:

403.4 MB

Використання команди du з subprocess

Переваги цього методу:

  • Точніший результат.
  • Швидше виконання.
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)

Підхід аналогічний method3, але цього разу отримуємо розмір каталогу.

При запуску отримаємо:

481M

Як ви бачите, ці два способи дають трохи різні результати. Чим більший каталог, тим більша різниця.

Вибір між pathlib і subprocess залежить від ваших потреб. Якщо ви впевнені, що завжди будете використовувати Linux, можна використовувати subprocess, в іншому випадку краще pathlib.

Підсумок

Python є потужним інструментом для взаємодії з операційною системою, дозволяючи автоматизувати процеси та заощаджувати час. Основні модулі для цього — os, sys, pathlib та subprocess.

У цьому посібнику ви дізналися:

  • Як Python взаємодіє з ОС.
  • Як використовувати вбудовані модулі для виконання операцій ОС.
  • Як використовувати модуль humanize для читабельного виводу розміру файлів.
  • Як визначити розмір файлу трьома різними способами.
  • Як розрахувати розмір каталогу рекурсивно або за допомогою команди du.