Met behulp van de standaardbibliotheek van Python os, kunt u de grootte (capaciteit) van een bestand of de totale grootte van de bestanden in een directory krijgen.
De volgende drie methoden worden uitgelegd. De eenheden van de maten die kunnen worden verkregen zijn allemaal bytes.
- Verkrijg de grootte van het bestand:
os.path.getsize()
- Verkrijg de grootte van een directory door de volgende functies te combineren (Python 3.5 of hoger):
os.scandir()
- Combineer de volgende functies om de grootte van de directory te verkrijgen (Python 3.4 en eerder):
os.listdir()
Verkrijg de grootte van het bestand: os.path.getsize()
De grootte (capaciteit) van het bestand kan worden verkregen met os.path.getsize().
Geef het pad van het bestand waarvan je de grootte wilt krijgen als argument.
import os
print(os.path.getsize('data/src/lena_square.png'))
# 473831
Verkrijg de grootte van een directory (map): os.scandir()
Om de totale grootte van de bestanden in een directory (map) te berekenen, gebruikt u os.scandir().
Deze functie werd toegevoegd in Python 3.5, dus eerdere versies gebruiken os.listdir(). os.listdir() voorbeeld wordt later beschreven.
Definieer een functie als volgt.
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() geeft een iterator van os.DirEntry object.
DirEntry-object, gebruik de methoden is_file() en is_dir() om te bepalen of het een bestand of een directory is. Indien het een bestand is, wordt de grootte verkregen uit het kenmerk st_size van het stat_result-object. In het geval van een directory wordt deze functie recursief aangeroepen om alle groottes bij elkaar op te tellen en de totale grootte terug te geven.
Bovendien geeft is_file() standaard WAAR terug voor symbolische koppelingen naar bestanden. Ook, is_dir() retourneert true voor symbolische links naar directories. Als je symbolische links wilt negeren, zet dan het follow_symlinks argument van is_file() en is_dir() op false.
Als je niet door de submappen hoeft te gaan, kun je ook gewoon het volgende gedeelte verwijderen.
elif entry.is_dir():
total += get_dir_size(entry.path)
De bovenstaande functie zal falen als het pad van het bestand als argument wordt doorgegeven. Indien u een functie nodig heeft om de grootte van een bestand of een map terug te geven, kunt u het volgende schrijven.
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
Verkrijg de grootte van een directory (map): os.listdir()
Er is geen os.scandir() in Python 3.4 of eerder, dus gebruik os.listdir().
Definieer een functie als volgt.
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
Het basisidee is hetzelfde als in het geval van os.scandir().
Wat kan worden verkregen met os.listdir() is een lijst van bestandsnamen (mapnamen). Elke bestandsnaam of mapnaam wordt samengevoegd met het pad van de bovenliggende map met os.path.join() om het volledige pad te maken.
Als het doel een symbolische link is, zullen os.path.isfile() en os.path.isdir() de entiteit beoordelen. Dus, als je symbolische koppelingen wilt negeren, gebruik dan voorwaardelijke beoordeling in combinatie met os.path.islink(), die waar teruggeeft voor symbolische koppelingen.
Net als in het geval van os.scandir(), als je niet door de submappen hoeft te gaan, verwijder je gewoon het volgende gedeelte.
elif os.path.isdir(full_path):
total += get_dir_size_old(full_path)
De bovenstaande functie zal falen als het pad van het bestand als argument wordt doorgegeven. Indien u een functie nodig heeft om de grootte van een bestand of een map terug te geven, kunt u het volgende schrijven.
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