Визначення Розміру Файлів та Папок за Допомогою 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
.