Zjištění velikosti souboru nebo adresáře (složky) v jazyce Python

Podnikání

Pomocí standardní knihovny Pythonu os můžete zjistit velikost (kapacitu) souboru nebo celkovou velikost souborů obsažených v adresáři.

Vysvětleny jsou následující tři metody. Jednotky velikostí, které lze získat, jsou všechny bajty.

  • Zjištění velikosti souboru:os.path.getsize()
  • Zjištění velikosti adresáře kombinací následujících funkcí (Python 3.5 nebo novější):os.scandir()
  • Kombinace následujících funkcí pro zjištění velikosti adresáře (Python 3.4 a starší):os.listdir()

Zjištění velikosti souboru: os.path.getsize()

Velikost (kapacitu) souboru lze zjistit pomocí os.path.getsize().

Jako argument zadejte cestu k souboru, jehož velikost chcete získat.

import os

print(os.path.getsize('data/src/lena_square.png'))
# 473831

Zjištění velikosti adresáře (složky): os.scandir()

Chcete-li vypočítat celkovou velikost souborů obsažených v adresáři (složce), použijte příkaz os.scandir().

Tato funkce byla přidána v Pythonu 3.5, takže starší verze používají os.listdir(). příklad os.listdir() je popsán později.

Definujte funkci takto.

def get_dir_size(path='.'):
    total = 0
    with os.scandir(path) as it:
        for entry in it:
            if entry.is_file():
                total += entry.stat().st_size
            elif entry.is_dir():
                total += get_dir_size(entry.path)
    return total

print(get_dir_size('data/src'))
# 56130856

os.scandir() vrací iterátor objektu os.DirEntry.

DirEntry, použijte metody is_file() a is_dir() k určení, zda se jedná o soubor nebo adresář. Pokud se jedná o soubor, velikost se zjistí z atributu st_size objektu stat_result. V případě adresáře je tato funkce volána rekurzivně, aby se sečetly všechny velikosti a vrátila se celková velikost.

Kromě toho funkce is_file() ve výchozím nastavení vrací hodnotu TRUE pro symbolické odkazy na soubory. Také funkce is_dir() vrací true pro symbolické odkazy na adresáře. Pokud chcete symbolické odkazy ignorovat, nastavte argument follow_symlinks v is_file() a is_dir() na false.

Pokud nepotřebujete procházet podadresáře, můžete následující část odstranit.

            elif entry.is_dir():
                total += get_dir_size(entry.path)

Výše uvedená funkce selže, pokud je jako argument předána cesta k souboru. Pokud potřebujete funkci, která vrátí velikost souboru nebo adresáře, můžete napsat následující příkaz.

def get_size(path='.'):
    if os.path.isfile(path):
        return os.path.getsize(path)
    elif os.path.isdir(path):
        return get_dir_size(path)

print(get_size('data/src'))
# 56130856

print(get_size('data/src/lena_square.png'))
# 473831

Zjištění velikosti adresáře (složky): os.listdir()

V jazyce Python 3.4 nebo starším neexistuje funkce os.scandir(), proto použijte funkci os.listdir().

Definujte funkci takto.

def get_dir_size_old(path='.'):
    total = 0
    for p in os.listdir(path):
        full_path = os.path.join(path, p)
        if os.path.isfile(full_path):
            total += os.path.getsize(full_path)
        elif os.path.isdir(full_path):
            total += get_dir_size_old(full_path)
    return total

print(get_dir_size_old('data/src'))
# 56130856

Základní myšlenka je stejná jako v případě funkce os.scandir().

Pomocí funkce os.listdir() lze získat seznam názvů souborů (adresářů). Každé jméno souboru nebo adresáře se spojí s cestou k nadřazenému adresáři pomocí os.path.join(), čímž se vytvoří úplná cesta.

Pokud je cílem symbolický odkaz, os.path.isfile() a os.path.isdir() posoudí entitu. Pokud tedy chcete ignorovat symbolické odkazy, použijte podmíněný úsudek v kombinaci s os.path.islink(), který pro symbolické odkazy vrací true.

Stejně jako v případě os.scandir(), pokud nepotřebujete procházet podadresáře, stačí odstranit následující část.

        elif os.path.isdir(full_path):
            total += get_dir_size_old(full_path)

Výše uvedená funkce selže, pokud je jako argument předána cesta k souboru. Pokud potřebujete funkci, která vrátí velikost souboru nebo adresáře, můžete napsat následující příkaz.

def get_size_old(path='.'):
    if os.path.isfile(path):
        return os.path.getsize(path)
    elif os.path.isdir(path):
        return get_dir_size_old(path)

print(get_size_old('data/src'))
# 56130856

print(get_size_old('data/src/lena_square.png'))
# 473831