
In Python, puoi ottenere la dimensione del file e la dimensione della directory (cartella) in byte con la libreria standard os.
In questo articolo vengono descritti i tre casi seguenti.
- Ottieni la dimensione del file con os.path.getsize()
- Ottieni la dimensione della directory con os.scandir() (Python 3.5 o successivo)
- Ottieni la dimensione della directory con os.listdir() (Python 3.4 o precedenti)
Se desideri ottenere il timestamp di un file, consulta il seguente articolo.
Ottieni la dimensione del file con os.path.getsize()
Puoi ottenere la dimensione di un file in byte con os.path.getsize().
Passa il percorso del file di cui vuoi ottenere la dimensione come argomento.
import os
print(os.path.getsize('data/src/lena_square.png'))
# 473831
Ottieni la dimensione della directory con os.scandir() (Python 3.5 o successivo)
Utilizzare os.scandir() per ottenere la dimensione totale dei file in una directory (cartella).
Nota che os.scandir() è stato aggiunto in Python 3.5, quindi usa os.listdir() nelle versioni precedenti. Vedi sotto per un esempio di os.listdir().
Definire la 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() fornisce l’iteratore degli oggetti os.DirEntry.
Utilizzare i metodi is_file() e is_dir() dell’oggetto os.DirEntry per verificare se si tratta di un file o di una directory.
Nel caso di un file, la dimensione viene recuperata con l’attributo st_size dell’oggetto stat_result e, nel caso di una directory, questa funzione viene chiamata ricorsivamente per aggiungere tutte le dimensioni e ripristinare la dimensione totale.
Si noti che, per controllare, is_file() fornisce True per i simbolici ai file e is_dir() restituisce True per i simbolici alle directory. Se si desidera ignorare i collegamenti simbolici, impostare l’argomento follow_symlinks di is_file() e is_dir() su False.
Inoltre, se vuoi ignorare le sottodirectory, elimina semplicemente la parte seguente.
elif entry.is_dir():
total += get_dir_size(entry.path)
La funzione precedente avrà un risultato negativo se il percorso del file viene passato come argomento. Se hai bisogno di una funzione per ripristinare la dimensione di un file o di una directory, puoi 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
Ottieni la dimensione della directory con os.listdir() (Python 3.4 o precedenti)
Per Python 3.4 o precedenti, usa os.listdir() perché non c’è os.scandir().
Definire la 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 per os.scandir().
os.listdir() fornisce un elenco di nomi di file e directory. Ogni nome di file o directory viene unito al percorso della directory padre con os.path.join() per creare un percorso completo.
Se la destinazione è un simbolo di collegamento, os.path.isfile() e os.path.isdir() ne controlla l’entità. Se vuoi ignorare i link simbolici, puoi usare os.path.islink() che invia True per i link simbolici.
Come nel caso di os.scandir(), se vuoi ignorare le sottodirectory, elimina la parte seguente.
elif os.path.isdir(full_path):
total += get_dir_size_old(full_path)
La funzione precedente avrà un risultato negativo se il percorso del file viene passato come argomento. Se hai bisogno di una funzione per ripristinare la dimensione di un file o di una directory, puoi 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