2022-11-19 15:31 Doba čtení: 14 min

Jak zkontrolovat velikost souboru a složky v Pythonu?

V tomto článku si ukážeme, jak v Pythonu zjistit velikost souborů a složek.

Python je mimořádně univerzální programovací jazyk, který umožňuje vytvářet širokou škálu aplikací – od jednoduchých nástrojů pro příkazovou řádku až po sofistikované webové aplikace.

Jednou z jeho často opomíjených schopností je interakce s operačním systémem. Správa systémových operací pomocí Pythonu může výrazně usnadnit automatizaci různých procesů a ušetřit vám mnoho času.

Pojďme se podívat, jak Python spolupracuje s OS.

Jak Python interaguje s operačním systémem?

Žádný program neexistuje izolovaně. V Pythonu je interakce s operačním systémem nezbytná pro efektivní provádění mnoha úkolů.

Python nabízí několik modulů, které umožňují komunikaci s OS. Mezi nejčastěji používané patří moduly os, sys, pathlib a subprocess.

Vzhledem k tomu, že jde o standardní moduly, není třeba je instalovat pomocí PIP. Stačí je jednoduše importovat pomocí následujícího kódu:

import os
import sys
import pathlib
import subprocess

Následující seznam stručně popisuje hlavní funkce každého z těchto modulů:

  • os: Poskytuje přenosný způsob, jak využívat funkce specifické pro daný operační systém. Většinou je to vhodná volba, pokud nepotřebujete žádné pokročilejší funkce.
  • sys: Umožňuje přístup k parametrům a funkcím specifickým pro systém. Tento modul nabízí přístup k proměnným a funkcím interpretu Pythonu. Modul `os` pracuje s operačním systémem, zatímco `sys` s interpretem Pythonu.
  • pathlib: Zajišťuje pokročilou manipulaci s cestami. Umožňuje reprezentovat souborový systém jako objekty s odpovídající sémantikou pro každý operační systém.
  • subprocess: Slouží pro správu spouštění a interakci s podprocesy přímo z Pythonu. To zahrnuje práci se standardním vstupem, výstupem a návratovými kódy. Více informací se dozvíte v našem specializovaném průvodci pro práci s podprocesy v Pythonu.

Existují i další specializované knihovny, které nabízejí ještě podrobnější funkce. Pro většinu běžných úkolů však bohatě postačí výše uvedené moduly.

Poznámka: Výstup funkcí z těchto modulů se může lišit v závislosti na operačním systému. Je dobré mít na paměti, že Python je obvykle nejvíce kompatibilní se systémy založenými na UNIX.

Nyní, když máte základní přehled o tom, jak Python komunikuje s OS, pojďme se podívat na metody pro zjišťování velikosti souborů a složek. Všechna následující řešení jsou dostupná v repozitáři na GitHubu s názvem "Velikost souboru a složky v Pythonu".

Využití os.stat().st_size

V tomto přístupu použijeme funkci stat() z modulu os. Tato funkce vrací podrobné informace o zadané cestě.

Poznámka: Funkce os.path.getsize() by také fungovala, avšak os.stat().st_size má výhodu v tom, že nesleduje symbolické odkazy.

Než začneme, vytvoříme si testovací soubor s názvem `lorem.txt`, do kterého vložíme nějaký vzorový text. Můžete navštívit web Lorem Ipsum generátor textu a zkopírovat text do souboru lorem.txt.

Ve stejném adresáři vytvořte soubor s názvem `method1.py` a vložte do něj následující kód:

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

Pojďme si tento kód rozebrat:

  • Na prvním řádku importujeme modul `os`.
  • Proměnná `size` uchovává velikost souboru `lorem.txt`.
    • Funkce `os.stat()` vrací obsáhlé informace o souboru.
    • Atribut `st_size` představuje konkrétní velikost souboru.
  • Nakonec vytiskneme proměnnou `size`.

Spusťte tento Python skript. Výsledná velikost bude záviset na obsahu vašeho souboru lorem.txt.

Výstup:

20064

Výstup je udáván v bajtech. Pro lepší čitelnost převedeme tuto hodnotu na srozumitelnější formát.

Nejprve nainstalujte balíček humanize pomocí následujícího příkazu v terminálu:

pip install humanize

Poté můžete použít funkci `naturalsize()`, která převede velikost v bajtech na formát čitelný pro člověka (např. KB, MB, GB nebo TB).

import os
from humanize import naturalsize

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

print(size)
print(naturalsize(size))

Výše uvedený kód nejprve vypíše velikost souboru v bajtech a poté převede tento výsledek na čitelnou velikost.

Výstup:

20064
20.1 kB

Využití Pathlib

Ačkoliv modul pathlib je primárně určen pro práci s cestami, obsahuje užitečné funkce z jiných modulů jako metody objektů Path (instance třídy Path).

Vytvořte soubor `method2.py` a importujte třídu Path.

from pathlib import Path

Nyní vytvořte objekt `Path`, kterému předáte cestu k souboru `lorem.txt` jako argument.

file_ = Path('lorem.txt')

Nyní máte přístup k metodě `stat()` třídy `Path`. Tato metoda funguje podobně jako funkce `os.stat()`, takže můžete snadno získat velikost souboru.

print(file_.stat().st_size)

Výstup:

20064

Jak vidíte, obdrželi jsme stejný výsledek jako v první metodě. I tento výsledek je v bajtech, můžeme tedy použít modul `humanize` pro lepší čitelnost.

from pathlib import Path
from humanize import naturalsize

size = Path('lorem.txt').stat().st_size

print(naturalsize(size))

Tento kód generuje následující výstup:

20.1 kB

Využití Unixových příkazů s modulem subprocess

Modul `subprocess` nám umožňuje spouštět a spravovat subprocesy z Pythonu. Můžeme tedy spustit libovolný příkaz a zpracovat jeho výstup přímo v Pythonu.

Poznámka: Tato metoda funguje pouze v operačních systémech UNIX (Linux, Mac).

Otevřete soubor `method3.py` a vložte do něj následující kód:

from subprocess import run

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

print(process.stdout)

Pojďme se na tento kód podívat blíže:

  • Importujeme funkci run z modulu `subprocess`.
  • Proměnná `process` obsahuje výsledek spuštění příkazu `du lorem.txt`.
    • `du` je nástroj v Linuxu, který umožňuje získat informace o využití diskového prostoru pro daný soubor.
    • `capture_output` nám poskytuje přístup k atributu `stdout` (standardní výstup).
    • `text` zajišťuje, že výstup je uložen jako řetězec, nikoli jako bajty.
  • Tiskneme standardní výstup procesu.

Po spuštění výše uvedeného kódu obdržíte následující výstup:

20      lorem.txt

Jak vidíte, zobrazí se velikost a název souboru. Pokud chcete získat pouze velikost, musíte výstup rozdělit (nezapomeňte, že je to řetězec) a vytisknout první prvek.

from subprocess import run

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

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

print(size)

Výstup:

20

Tento výstup není příliš čitelný. Můžeme se domnívat, že se jedná o KB (na základě předchozích metod), ale bez dalšího kontextu je těžké odhadnout velikost souboru.

Pro vyřešení tohoto problému můžeme použít parametr `-h` (human-readable).

Poznámka: Manuál k tomuto příkazu zobrazíte pomocí příkazu `man du` nebo `du --help`.

from subprocess import run

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

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

print(size)

Nyní bude výstup tohoto skriptu mnohem srozumitelnější:

20K

Chcete-li se dozvědět více o modulu `subprocess` a jeho využití, doporučujeme si přečíst našeho průvodce o práci s podprocesy v Pythonu.

Získání velikosti složky rekurzivně

Pokud potřebujete získat velikost celé složky, musíte projít všechny soubory v daném adresáři a jeho podadresářích. Ukážeme si dva způsoby, jak toho docílit:

  • Iterace přes cesty pomocí modulu `pathlib`.
  • Využití příkazu `du` s modulem `subprocess`.

V následujícím kódu použijeme testovací adresář v mém domovském adresáři. Budete muset nahradit cestu v kódu vaší konkrétní cestou k adresáři, jehož velikost chcete zjistit.

Iterace přes cestu s pathlib

Podívejme se, jak zjistit velikost adresáře pomocí iterace přes soubory.

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))

Tento kód vypadá možná trochu složitě, takže si ho rozebereme po částech:

  • Importujeme třídu `Path` a funkci `naturalsize()`.
  • Definujeme funkci `get_size()` s parametrem `path`, který ve výchozím nastavení ukazuje na aktuální adresář.
  • Proměnná `size` je inicializována na 0 a bude postupně navyšována o velikosti jednotlivých souborů.
  • Iterujeme přes všechny soubory v zadané cestě pomocí metody `rglob()` pro rekurzivní procházení.
  • Zjišťujeme velikost každého souboru a přičítáme ji k proměnné `size`.
  • Funkce vrací proměnnou `size` ve formátu čitelném pro člověka.

Tuto funkci testuji na adresáři, který je dostupný pouze v mém počítači. Nezapomeňte nahradit cestu k adresáři vaší konkrétní cestou.

V mém případě dostanu následující výstup:

403.4 MB

Využití příkazu `du` s modulem `subprocess`

Tento přístup má několik výhod:

  • Výsledky jsou o něco přesnější.
  • Je to rychlejší.
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)

Používáme stejný přístup jako v metodě 3, ale tentokrát získáváme velikost celého adresáře, nikoli jen jednoho souboru.

Výstup:

481M

Jak můžete vidět, tyto dva způsoby získání velikosti složky vrací mírně odlišné výsledky. Čím větší je adresář, tím větší je i rozdíl v naměřených hodnotách.

Je na vás, zda upřednostníte přístup s `pathlib` nebo s `subprocess`. Pokud víte, že budete vždy používat Linux, můžete zvolit `subprocess`, jinak je univerzálnější řešení s `pathlib`.

Shrnutí

Python je mimořádně užitečný při interakci s operačním systémem. S jeho pomocí můžete automatizovat různé procesy a ušetřit spoustu času. Klíčovými moduly pro interakci s OS jsou `os`, `sys`, `pathlib` a `subprocess`.

V tomto článku jste se naučili:

  • Jak Python interaguje s operačním systémem.
  • Jak používat vestavěné moduly pro provádění operací s OS.
  • Jak využít modul `humanize` pro výpis hodnot v čitelné formě.
  • Tři způsoby výpočtu velikosti souboru.
  • Jak rekurzivně spočítat velikost adresáře nebo použít příkaz `du`.
Tomáš Dvořák
Autor
Czechia

Píše o bezpečnosti, webu a chytrých službách s důrazem na srozumitelnost.

Předchozí článek
Jak smazat účet Yelp
Další článek
Proč potřebujete získat virtuální plochu právě teď?