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