Utilizzando la libreria standard di Python os, è possibile ottenere la dimensione (capacità) di un file o la dimensione totale dei file contenuti in una directory.
Vengono spiegati i tre metodi seguenti. Le unità delle dimensioni che possono essere ottenute sono tutte byte.
- Ottenere la dimensione del file:
os.path.getsize()
- Ottenere la dimensione di una directory combinando le seguenti funzioni (Python 3.5 o successivo):
os.scandir()
- Combinate le seguenti funzioni per ottenere la dimensione della directory (Python 3.4 e precedenti):
os.listdir()
Ottenere la dimensione del file: os.path.getsize()
La dimensione (capacità) del file può essere ottenuta con os.path.getsize().
Date il percorso del file di cui volete ottenere la dimensione come argomento.
import os
print(os.path.getsize('data/src/lena_square.png'))
# 473831
Ottenere la dimensione di una directory (cartella): os.scandir()
Per calcolare la dimensione totale dei file contenuti in una directory (cartella), usate os.scandir().
Questa funzione è stata aggiunta in Python 3.5, quindi le versioni precedenti usano os.listdir().
Definire una funzione come segue.
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() restituisce un iteratore di oggetti os.DirEntry.
DirEntry, usa i metodi is_file() e is_dir() per determinare se è un file o una directory. Se è un file, la dimensione è ottenuta dall'attributo st_size dell'oggetto stat_result. Nel caso di una directory, questa funzione viene chiamata ricorsivamente per sommare tutte le dimensioni e restituire la dimensione totale.
Inoltre, per default, is_file() restituisce TRUE per i collegamenti simbolici ai file. Inoltre, is_dir() restituisce true per i collegamenti simbolici alle directory. Se volete ignorare i collegamenti simbolici, impostate l'argomento follow_symlinks di is_file() e is_dir() a false.
Inoltre, se non avete bisogno di attraversare le sottodirectory, potete semplicemente cancellare la parte seguente.
elif entry.is_dir():
total += get_dir_size(entry.path)
La funzione di cui sopra fallirà se il percorso del file viene passato come argomento. Se avete bisogno di una funzione che restituisca la dimensione di un file o di una directory, potete scrivere quanto segue.
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
Ottenere la dimensione di una directory (cartella): os.listdir()
Non c'è os.scandir() in Python 3.4 o precedenti, quindi usate os.listdir().
Definire una funzione come segue.
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
L'idea di base è la stessa del caso di os.scandir().
Ciò che si può ottenere con os.listdir() è una lista di nomi di file (nomi di directory). Ogni nome di file o di directory viene unito al percorso della directory madre con os.path.join() per creare il percorso completo.
Se la destinazione è un link simbolico, os.path.isfile() e os.path.isdir() giudicheranno l'entità. Quindi, se volete ignorare i collegamenti simbolici, usate il giudizio condizionale in combinazione con os.path.islink(), che restituisce true per i collegamenti simbolici.
Come nel caso di os.scandir(), se non avete bisogno di attraversare le sottodirectory, eliminate semplicemente la parte seguente.
elif os.path.isdir(full_path):
total += get_dir_size_old(full_path)
La funzione di cui sopra fallirà se il percorso del file viene passato come argomento. Se avete bisogno di una funzione che restituisca la dimensione di un file o di una directory, potete scrivere quanto segue.
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