Z uporabo Pythonove standardne knjižnice os lahko dobite velikost (zmogljivost) datoteke ali skupno velikost datotek v imeniku.
Razloženi so naslednji trije načini. Enote velikosti, ki jih je mogoče dobiti, so vsi bajti.
- Pridobite velikost datoteke:
os.path.getsize()
- Velikost imenika dobite s kombinacijo naslednjih funkcij (Python 3.5 ali novejši):
os.scandir()
- Za določitev velikosti imenika združite naslednje funkcije (Python 3.4 in starejše):
os.listdir()
Pridobite velikost datoteke: os.path.getsize()
Velikost (zmogljivost) datoteke lahko dobite z os.path.getsize().
Kot argument navedite pot do datoteke, katere velikost želite pridobiti.
import os
print(os.path.getsize('data/src/lena_square.png'))
# 473831
Pridobite velikost imenika (mape): os.scandir()
Če želite izračunati skupno velikost datotek v imeniku (mapi), uporabite os.scandir().
Ta funkcija je bila dodana v Pythonu 3.5, zato prejšnje različice uporabljajo os.listdir(). primer os.listdir() je opisan kasneje.
Opredelite funkcijo na naslednji način.
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() vrne iterator objekta os.DirEntry.
DirEntry uporabite metodi is_file() in is_dir(), da ugotovite, ali gre za datoteko ali imenik. Če gre za datoteko, se velikost pridobi iz atributa st_size objekta stat_result. Če gre za imenik, se ta funkcija rekurzivno pokliče, da sešteje vse velikosti in vrne skupno velikost.
Poleg tega funkcija is_file() privzeto vrne TRUE za simbolne povezave do datotek. Tudi is_dir() vrne true za simbolne povezave do imenikov. Če želite prezreti simbolne povezave, nastavite argument follow_symlinks v is_file() in is_dir() na false.
Če vam ni treba brskati po podimenikih, lahko izbrišete naslednji del.
elif entry.is_dir():
total += get_dir_size(entry.path)
Zgornja funkcija bo neuspešna, če je kot argument posredovana pot do datoteke. Če potrebujete funkcijo, ki bo vrnila velikost datoteke ali imenika, lahko napišete naslednje.
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
Pridobite velikost imenika (mape): os.listdir()
V Pythonu 3.4 ali starejših ni funkcije os.scandir(), zato uporabite os.listdir().
Opredelite funkcijo na naslednji način.
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
Osnovna ideja je enaka kot v primeru os.scandir().
S funkcijo os.listdir() lahko dobite seznam imen datotek (imen imenikov). Vsako ime datoteke ali imenika se združi s potjo nadrejenega imenika z os.path.join(), da se ustvari celotna pot.
Če je cilj simbolna povezava, bosta os.path.isfile() in os.path.isdir() presodila entiteto. Če torej želite prezreti simbolne povezave, uporabite pogojno presojo v kombinaciji z os.path.islink(), ki vrne true za simbolne povezave.
Tako kot v primeru os.scandir(), če vam ni treba brskati po podimenikih, preprosto izbrišite naslednji del.
elif os.path.isdir(full_path):
total += get_dir_size_old(full_path)
Zgornja funkcija bo neuspešna, če je kot argument posredovana pot do datoteke. Če potrebujete funkcijo, ki bo vrnila velikost datoteke ali imenika, lahko napišete naslednje.
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