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

У цій статті ви навчитеся перевіряти розмір файлу чи папки в Python

Python є однією з найбільш універсальних мов програмування. З його допомогою ви зможете створити від невеликої програми CLI (інтерфейс командного рядка) до складної веб-програми.

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

Давайте подивимося, як Python взаємодіє з ОС.

Як Python взаємодіє з ОС?

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

У Python є кілька модулів, які дозволяють нам взаємодіяти з ОС. Найчастіше використовуються os, sys, pathlib і subprocess.

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

import os
import sys
import pathlib
import subprocess

У наведеному нижче списку вказано основні функції кожного з цих імпортованих даних:

  • OS: портативний спосіб використання системних (залежно від вашої ОС) функцій. Це правильний вибір у більшості випадків, якщо вам не потрібно щось більш складне
  • Sys: системні параметри та функції. Цей модуль забезпечує доступ до змінних і функцій інтерпретатора. Модуль os взаємодіє з операційною системою, а sys — з інтерпретатором Python
  • Pathlib: розширене використання шляху. Дозволяє представляти файлові системи як об’єкти з відповідною семантикою для кожної ОС.
  • Підпроцес: виконання та керування підпроцесами безпосередньо з Python. Це передбачає роботу з стандартним введенням, стандартним виведенням і кодами повернення. Ви можете дізнатися більше про це, прочитавши наш посібник з підпроцесів Python.

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

Примітка. Більшість функцій, що надаються цими модулями, матимуть різний вихід залежно від вашої ОС. Пам’ятайте, що зазвичай найкращий збіг UNIX і Python.

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

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

У цьому методі ми будемо використовувати stat() функція з модуля os. Він повертає багато інформації про певний шлях.

  Як змінити дію подвійного дотику на Apple Pencil для iPad Pro

Примітка. Функція 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 представляє розмір файлу
  • Ми друкуємо змінну розміру

Спробуйте запустити скрипт Python. Ви отримаєте інший результат залежно від вмісту вашого файлу lorem.txt.

Вихід:

20064

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

Спочатку встановіть олюднити пакет, запустивши таку команду в оболонці:

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 (Примірники класу Path).

Створіть файл method2.py та імпортуйте Клас шляху.

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 дозволяє викликати підпроцеси та керувати ними з Python. Тому ми можемо запустити будь-яку команду та обробляти її вихід безпосередньо в Python.

  Як керувати безлімітною підпискою Kindle

Примітка. Цей метод працює, лише якщо ви використовуєте ОС Unix (Linux, Mac)

Відкрийте файл method3.py і вставте наведений нижче код:

from subprocess import run

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

print(process.stdout)

Занурившись у цей фрагмент коду:

  • Ми імпортуємо функція запуску з модуля підпроцесу
  • Змінна процес містить результат виконання команди du lorem.txt
    • du — це утиліта Linux, яка дозволяє нам отримати дисковий простір файлу
    • capture_output дає нам доступ до атрибута standout (стандартний вихід).
    • текст означає, що ми зберігаємо результат як рядок замість байтів
  • Ми друкуємо стандартний вихід процесу

Якщо ви запустите наведений вище код, ви отримаєте такий результат:

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 (для читання людиною).

Примітка. Ви можете отримати посібник із цієї команди, запустивши 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

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

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

Якщо ви хочете отримати розмір папки, вам потрібно буде перейти до кожного файлу в каталозі та його підкаталогах. Ми зробимо це двома способами:

  • Ітерація шляху за допомогою pathlib
  • Використання команди du з підпроцесом
  9 найкращих вертикальних моніторів для підвищення продуктивності

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

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

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

У моєму випадку я отримую такий результат:

403.4 MB

Використання команди 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)

Ми використовуємо той самий підхід, що й метод 3, але цього разу ми отримуємо розмір каталогу замість файлу.

Вихід:

481M

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

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

Підсумовуючи

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

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

  • Як Python взаємодіє з ОС
  • Використання вбудованих модулів для виконання операцій ОС
  • Як використовувати модуль гуманізації, щоб друкувати так, щоб він читався людиною
  • Розрахувати розмір файлу з 3 підходів
  • Щоб обчислити розмір каталогу рекурсивно або за допомогою команди du