Pomocou štandardnej knižnice Python os môžete zistiť veľkosť (kapacitu) súboru alebo celkovú veľkosť súborov obsiahnutých v adresári.
Vysvetľujú sa tieto tri metódy. Jednotky veľkostí, ktoré možno získať, sú všetky bajty.
- Získanie veľkosti súboru:
os.path.getsize()
- Zistite veľkosť adresára kombináciou nasledujúcich funkcií (Python 3.5 alebo novší):
os.scandir()
- Kombináciou nasledujúcich funkcií získate veľkosť adresára (Python 3.4 a staršie):
os.listdir()
Získanie veľkosti súboru: os.path.getsize()
Veľkosť (kapacitu) súboru možno zistiť pomocou os.path.getsize().
Ako argument zadajte cestu k súboru, ktorého veľkosť chcete získať.
import os
print(os.path.getsize('data/src/lena_square.png'))
# 473831
Získanie veľkosti adresára (priečinka): os.scandir()
Ak chcete vypočítať celkovú veľkosť súborov obsiahnutých v adresári (priečinku), použite os.scandir().
Táto funkcia bola pridaná v Pythone 3.5, takže staršie verzie používajú os.listdir(). príklad os.listdir() je popísaný neskôr.
Definujte funkciu 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() vráti iterátor objektu os.DirEntry.
DirEntry, použite metódy is_file() a is_dir() na určenie, či ide o súbor alebo adresár. Ak ide o súbor, veľkosť sa získa z atribútu st_size objektu stat_result. V prípade adresára sa táto funkcia volá rekurzívne, aby sa sčítali všetky veľkosti a vrátila sa celková veľkosť.
Okrem toho funkcia is_file() v predvolenom nastavení vracia TRUE pre symbolické odkazy na súbory. Funkcia is_dir() tiež vracia true pre symbolické odkazy na adresáre. Ak chcete ignorovať symbolické odkazy, nastavte argument follow_symlinks funkcií is_file() a is_dir() na false.
Ak nepotrebujete prechádzať podadresáre, môžete jednoducho odstrániť nasledujúcu časť.
elif entry.is_dir():
total += get_dir_size(entry.path)
Vyššie uvedená funkcia zlyhá, ak je ako argument odovzdaná cesta k súboru. Ak potrebujete funkciu na vrátenie veľkosti súboru alebo adresára, môžete napísať nasledujúce.
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
Získanie veľkosti adresára (priečinka): os.listdir()
V jazyku Python 3.4 a starších neexistuje funkcia os.scandir(), preto použite funkciu os.listdir().
Definujte funkciu 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šlienka je rovnaká ako v prípade funkcie os.scandir().
Pomocou funkcie os.listdir() možno získať zoznam názvov súborov (názvov adresárov). Každý názov súboru alebo adresára sa spojí s cestou nadradeného adresára pomocou funkcie os.path.join(), čím sa vytvorí úplná cesta.
Ak je cieľom symbolický odkaz, os.path.isfile() a os.path.isdir() posúdia entitu. Ak teda chcete ignorovať symbolické odkazy, použite podmienené posudzovanie v kombinácii s os.path.islink(), ktoré pre symbolické odkazy vracia true.
Podobne ako v prípade funkcie os.scandir(), ak nepotrebujete prechádzať podadresáre, stačí odstrániť nasledujúcu časť.
elif os.path.isdir(full_path):
total += get_dir_size_old(full_path)
Vyššie uvedená funkcia zlyhá, ak je ako argument odovzdaná cesta k súboru. Ak potrebujete funkciu na vrátenie veľkosti súboru alebo adresára, môžete napísať nasledujúce.
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