Koristeći OS standardne biblioteke Python, možete dobiti veličinu (kapacitet) datoteke ili ukupnu veličinu datoteka sadržanih u direktoriju.
Objašnjene su sljedeće tri metode. Jedinice veličina koje se mogu dobiti su svi bajtovi.
- Dobijte veličinu datoteke:
os.path.getsize()
- Dobijte veličinu direktorija kombiniranjem sljedećih funkcija (Python 3.5 ili noviji):
os.scandir()
- Kombinirajte sljedeće funkcije da biste dobili veličinu direktorija (Python 3.4 i stariji):
os.listdir()
Dobijte veličinu datoteke:os.path.getsize()
Veličina (kapacitet) datoteke može se dobiti pomoću os.path.getsize().
Navedite stazu datoteke čiju veličinu želite dobiti kao argument.
import os
print(os.path.getsize('data/src/lena_square.png'))
# 473831
Dobijte veličinu direktorija (mape):os.scandir()
Za izračunavanje ukupne veličine datoteka sadržanih u direktoriju (mapi), koristite os.scandir().
Ova je funkcija dodana u Python 3.5, tako da starije verzije koriste os.listdir(). Primjer os.listdir() opisan je kasnije.
Definirajte funkciju na sljedeći 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() vraća iterator os.DirEntry objekta.
Objekt DirEntry, koristite metode is_file() i is_dir() da odredite je li to datoteka ili direktorij. Ako se radi o datoteci, veličina se dobiva iz atributa st_size objekta stat_result. U slučaju imenika, ova funkcija se poziva rekurzivno da zbroji sve veličine i vrati ukupnu veličinu.
Osim toga, prema zadanim postavkama, is_file() vraća TRUE za simboličke veze na datoteke. Također, is_dir() vraća true za simboličke veze na direktorije. Ako želite zanemariti simboličke veze, postavite argument follow_symlinks za is_file() i is_dir() na false.
Također, ako ne trebate prolaziti kroz poddirektorijume, možete jednostavno izbrisati sljedeći dio.
elif entry.is_dir():
total += get_dir_size(entry.path)
Gornja funkcija neće uspjeti ako se put datoteke prenese kao argument. Ako vam je potrebna funkcija za vraćanje veličine datoteke ili direktorija, možete napisati sljedeće.
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
Dobijte veličinu direktorija (mape):os.listdir()
Ne postoji os.scandir() u Pythonu 3.4 ili ranijem, stoga koristite os.listdir().
Definirajte funkciju na sljedeći 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 ista kao u slučaju os.scandir().
Ono što se može dobiti pomoću os.listdir() je popis naziva datoteka (imena direktorija). Svaki naziv datoteke ili ime direktorija spaja se s stazom roditeljskog direktorija pomoću os.path.join() kako bi se stvorio puni put.
Ako je cilj simbolička veza, os.path.isfile() i os.path.isdir() će suditi o entitetu. Dakle, ako želite zanemariti simboličke veze, upotrijebite uvjetnu prosudbu u kombinaciji s os.path.islink(), koja vraća true za simboličke veze.
Kao iu slučaju os.scandir(), ako ne trebate prelaziti poddirektorije, samo izbrišite sljedeći dio.
elif os.path.isdir(full_path):
total += get_dir_size_old(full_path)
Gornja funkcija neće uspjeti ako se put datoteke prenese kao argument. Ako vam je potrebna funkcija za vraćanje veličine datoteke ili direktorija, možete napisati sljedeće.
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