Ottenere la dimensione di un file o di una directory (cartella) in Python

Attività commerciale

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
Copied title and URL