Jak zkontrolovat velikost souboru a složky v Pythonu?

V tomto článku se naučíte kontrolovat velikost souboru nebo složky v Pythonu

Python je jedním z nejuniverzálnějších programovacích jazyků. S ním budete schopni vytvořit od malého CLI (Command-line interface) programu až po komplexní webovou aplikaci.

Jednou z jeho nejvíce podceňovaných vlastností je však schopnost interakce s operačními systémy. Správa operací OS pomocí Pythonu vám může ušetřit spoustu času při vytváření automatizačních procesů.

Podívejme se, jak Python spolupracuje s OS.

Jak Python spolupracuje s OS?

Nikdo nemůže žít izolovaně od svého prostředí. To platí také v Pythonu, kde je někdy zásadní interakce s operačním systémem, aby bylo možné věci udělat.

Python má několik modulů, které nám umožňují interakci s OS. Nejpoužívanější jsou os, sys, pathlib a subprocess.

Protože se jedná o vestavěné moduly, nebudete je muset instalovat pomocí PIP. Všechny je můžete importovat pomocí následujícího příkazu:

import os
import sys
import pathlib
import subprocess

Níže uvedený seznam uvádí hlavní funkce každého z těchto importů:

  • OS: Přenosný způsob použití funkcí specifických pro systém (v závislosti na vašem operačním systému). Ve většině případů je to správná volba, pokud nepotřebujete něco pokročilejšího
  • Sys: Parametry a funkce specifické pro systém. Tento modul poskytuje přístup k proměnným a funkcím interpretu. Modul os spolupracuje s operačním systémem a sys spolupracuje s interpretem Pythonu
  • Pathlib: Pokročilé použití cesty. Umožňuje reprezentovat souborové systémy jako objekty s příslušnou sémantikou pro každý OS.
  • Subprocess: Správa spouštění a podprocesů přímo z Pythonu. To zahrnuje práci s stdin, stdout a návratovými kódy. Můžete se o něm dozvědět více, když si přečtete našeho průvodce dílčími procesy Pythonu.

Existují knihovny na vysoké úrovni, které obsahují ještě specifičtější funkce v závislosti na vašich potřebách. Většinou je však dobré jít s výše uvedenými moduly.

Poznámka: Většina funkcí poskytovaných těmito moduly bude mít různý výstup v závislosti na vašem operačním systému. Pamatujte, že obvykle je nejlepší shoda UNIX a Python.

  Jak zarovnat text uvnitř tabulek v aplikaci Microsoft Word

Nyní máte rychlý přehled o tom, jak Python spolupracuje s OS, pojďme se vrhnout na metody kontroly velikosti souboru a složky. Všechna následující řešení jsou k dispozici v Velikost souboru a složky v Pythonu úložiště GitHub

Pomocí os.stat().st_size

V této metodě použijeme stat() funkce z modulu os. Vrací mnoho informací o konkrétní cestě.

Poznámka: Funkce os.path.getsize() také dokončí práci. Výhodou použití os.stat().st_size je, že nenásleduje simlinky.

Než budeme pokračovat, vytvoříme testovací soubor s názvem lorem.txt, do kterého vložíme nějaký hloupý text. Můžeme navštívit a Textový generátor Lorem Ipsum a vložte text do souboru lorem.txt.

Ve stejném adresáři vytvořte soubor s názvem method1.py a vložte níže uvedený kód:

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

Pojďme si rozebrat, co s tímto kódem děláme:

  • V prvním řádku importujeme modul os
  • Proměnná size obsahuje velikost souboru lorem.txt
    • Funkce os.stat() vrací spoustu informací souvisejících se souborem
    • Atribut st_size představuje velikost souboru
  • Vytiskneme proměnnou velikosti

Zkuste spustit skript Python. V závislosti na obsahu vašeho souboru lorem.txt získáte jiný výsledek.

Výstup:

20064

Výstup je reprezentován v bytech. To není vůbec čitelné, tak to polidštěme, abychom měli lepší perspektivu velikosti souboru.

Nejprve nainstalujte humanizovat balíček spuštěním následujícího příkazu ve vašem shellu:

pip install humanize

Pak můžete použít funkci naturalsize(), která převede hodnotu v bajtech na čitelnou velikost souboru, například 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 vytiskne velikost souboru v bajtech a poté vytiskne výsledek v čitelné velikosti.

Výstup:

20064
20.1 kB

Pomocí Pathlib

Ačkoli pathlib je navržen pro práci výhradně s cestami, obsahuje některé užitečné funkce z jiných modulů jako metody objektů Path (Instance třídy Path).

Vytvořte soubor method2.py a importujte soubor Třída cesty.

from pathlib import Path

Poté vytvořte objekt Path, který jako argument předá cestu k souboru lorem.txt.

file_ = Path('lorem.txt')

Nyní máte přístup k metodě stat() třídy Path. Funguje stejně jako funkce os.stat(), takže budete moci vytisknout velikost souboru.

print(file_.stat().st_size)

Výstup:

20064

Jak vidíte, dostali jsme stejný výsledek jako u první metody, kterou jsme použili. Výše uvedený výsledek je také vytištěn v bajtovém formátu, takže můžeme použít modul humanizace, aby byl čitelný.

from pathlib import Path
from humanize import naturalsize

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

print(naturalsize(size))

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

20.1 kB

Použití unixových příkazů s podprocesem:

Modul subprocess nám umožňuje volat a spravovat subproces z Pythonu. Můžeme tedy spustit libovolný příkaz a zpracovat jeho výstup přímo v Pythonu.

  Co je lepší pro testování zabezpečení aplikací?

Poznámka: Tato metoda funguje pouze v případě, že používáte operační systém Unix (Linux, Mac)

Otevřete soubor method3.py a vložte níže uvedený kód:

from subprocess import run

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

print(process.stdout)

Ponořte se do tohoto kódu:

  • Dovážíme spustit funkci z modulu podprocesů
  • Proměnný proces obsahuje výsledek spuštění příkazu du lorem.txt
    • du je nástroj pro Linux, který nám umožňuje získat místo na disku souboru
    • capture_output nám poskytuje přístup k atributu standout (standardní výstup).
    • text znamená, že výstup ukládáme jako řetězec namísto bajtů
  • Tiskneme standardní výstup procesu

Pokud spustíte výše uvedený kód, získáte následující výstup:

20      lorem.txt

Jak vidíte, dává nám velikost a název souboru. Pokud chcete získat pouze velikost souboru, budete muset rozdělit výstup (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í vůbec čitelný. Můžeme odvodit, že použitá měrná jednotka je KB (kvůli předchozím metodám), ale nikdo jiný nemohl odhadnout velikost souboru.

K vyřešení tohoto problému můžeme použít parametr -h (čitelný pro člověka).

Poznámka: Manuál k tomuto příkazu získáte spuštěním 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 čitelnější:

20K

Pokud se chcete dozvědět více o modulu subprocess a možných aplikacích, podívejte se na našeho průvodce subprocess v Pythonu.

Získejte velikost složky rekurzivně

Pokud chcete získat velikost složky, budete muset iterovat každý soubor přítomný v adresáři a jeho podadresářích. Uděláme to dvěma způsoby:

  • Iterace přes cestu s pathlib
  • Použití příkazu du s podprocesem
  12 alternativ ClickFunnels k použití v roce 2022

Následující kód bude používat cestu k testovacímu adresáři v mé domovské složce. Budete muset nahradit cestu k tomuto souboru za adresář, jehož velikost chcete získat.

Iterace přes cestu s pathlib

Podívejme se, jak můžete získat velikost adresáře iterací přes velikosti souborů.

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 kus kódu vypadá trochu děsivě, pojďme si rozebrat, co jednotlivé části dělají.

  • Importujte třídu Path a funkci naturalsize().
  • Definujte funkci get_size() s cestou parametru, která ve výchozím nastavení ukazuje na aktuální adresář.
  • Proměnná size je pouze zástupný symbol, do kterého budeme přidávat velikost každého souboru
  • Iterujte každý soubor cesty
  • Získejte velikost každého souboru a přidejte ji do proměnné velikosti
  • Vrátí proměnnou velikosti způsobem čitelným pro člověka

Funkci samozřejmě testuji s adresářem dostupným pouze v mém počítači. Nezapomeňte změnit cestu ke složce, která existuje ve vašem počítači.

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

403.4 MB

Použití příkazu du s podprocesem

Tento přístup má některé výhody:

  • Výsledek je o něco přesnější
  • Je to mnohem 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 metoda 3, ale tentokrát získáváme velikost adresáře místo souboru.

Výstup:

481M

Jak můžete vidět, tyto dva způsoby, jak získat velikost složky, vrátí mírně odlišný výsledek. Čím větší je adresář, tím větší rozdíl získáte.

Je na vás, abyste si vybrali mezi přístupy pathlib nebo subprocess. Pokud víte, že budete používat Linux pokaždé, když použijete podproces, jinak můžete použít řešení pathlib.

Abych to shrnul

Výsledky Pythonu jsou velmi užitečné při interakci s OS. S Pythonem můžete automatizovat procesy a ušetřit spoustu času. Hlavní moduly pro interakci s operačním systémem jsou os, sys, cesta a podproces.

V tomto tutoriálu jste se naučili:

  • Jak Python spolupracuje s OS
  • Použití vestavěných modulů k provádění operací OS
  • Jak používat modul humanizace k tisku čitelnému pro člověka
  • Pro výpočet velikosti souboru pomocí 3 přístupů
  • Chcete-li vypočítat velikost adresáře rekurzivně nebo pomocí příkazu du