Ermittlung der Größe einer Datei oder eines Verzeichnisses (Ordners) in Python

Geschäft

Mit Hilfe der Python-Standardbibliothek os können Sie die Größe (Kapazität) einer Datei oder die Gesamtgröße der in einem Verzeichnis enthaltenen Dateien ermitteln.

Die folgenden drei Methoden werden erläutert. Die Einheiten der Größen, die erhalten werden können, sind alle Bytes.

  • Größe der Datei ermitteln:os.path.getsize()
  • Ermitteln Sie die Größe eines Verzeichnisses, indem Sie die folgenden Funktionen kombinieren (Python 3.5 oder höher):os.scandir()
  • Kombinieren Sie die folgenden Funktionen, um die Größe des Verzeichnisses zu ermitteln (Python 3.4 und früher):os.listdir()

Größe der Datei ermitteln: os.path.getsize()

Die Größe (Kapazität) der Datei kann mit os.path.getsize() ermittelt werden.

Geben Sie als Argument den Pfad der Datei an, deren Größe Sie ermitteln möchten.

import os

print(os.path.getsize('data/src/lena_square.png'))
# 473831

Ermitteln der Größe eines Verzeichnisses (Ordners): os.scandir()

Um die Gesamtgröße der in einem Verzeichnis (Ordner) enthaltenen Dateien zu berechnen, verwenden Sie os.scandir().

Diese Funktion wurde in Python 3.5 hinzugefügt, so dass frühere Versionen os.listdir() verwenden. Das Beispiel von os.listdir() wird später beschrieben.

Definieren Sie eine Funktion wie folgt.

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() gibt einen Iterator des os.DirEntry-Objekts zurück.

DirEntry-Objekts wird mit den Methoden is_file() und is_dir() ermittelt, ob es sich um eine Datei oder ein Verzeichnis handelt. Wenn es sich um eine Datei handelt, wird die Größe aus dem Attribut st_size des stat_result-Objekts ermittelt. Handelt es sich um ein Verzeichnis, wird diese Funktion rekursiv aufgerufen, um alle Größen zu addieren und die Gesamtgröße zurückzugeben.

Darüber hinaus gibt is_file() standardmäßig TRUE für symbolische Links auf Dateien zurück. Auch is_dir() gibt true für symbolische Links auf Verzeichnisse zurück. Wenn Sie symbolische Links ignorieren wollen, setzen Sie das Argument follow_symlinks von is_file() und is_dir() auf false.

Wenn Sie die Unterverzeichnisse nicht durchsuchen müssen, können Sie auch einfach den folgenden Teil löschen.

            elif entry.is_dir():
                total += get_dir_size(entry.path)

Die obige Funktion schlägt fehl, wenn der Pfad der Datei als Argument übergeben wird. Wenn Sie eine Funktion benötigen, die die Größe einer Datei oder eines Verzeichnisses zurückgibt, können Sie folgendes schreiben.

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

Ermitteln der Größe eines Verzeichnisses (Ordners): os.listdir()

In Python 3.4 oder früher gibt es kein os.scandir(), also verwenden Sie os.listdir().

Definieren Sie eine Funktion wie folgt.

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

Der Grundgedanke ist der gleiche wie bei os.scandir().

Was man mit os.listdir() erhält, ist eine Liste von Dateinamen (Verzeichnisnamen). Jeder Dateiname oder Verzeichnisname wird mit dem Pfad des übergeordneten Verzeichnisses mit os.path.join() verbunden, um den vollständigen Pfad zu erstellen.

Wenn das Ziel ein symbolischer Link ist, werden os.path.isfile() und os.path.isdir() die Entität beurteilen. Wenn Sie also symbolische Links ignorieren wollen, verwenden Sie die bedingte Beurteilung in Kombination mit os.path.islink(), die für symbolische Links true zurückgibt.

Wie im Fall von os.scandir(), wenn Sie die Unterverzeichnisse nicht durchlaufen müssen, löschen Sie einfach den folgenden Teil.

        elif os.path.isdir(full_path):
            total += get_dir_size_old(full_path)

Die obige Funktion schlägt fehl, wenn der Pfad der Datei als Argument übergeben wird. Wenn Sie eine Funktion benötigen, die die Größe einer Datei oder eines Verzeichnisses zurückgibt, können Sie folgendes schreiben.

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