Få fram storleken på en fil eller katalog (mapp) i Python

Företag

Med hjälp av Pythons standardbibliotek os kan du få fram storleken (kapaciteten) på en fil eller den totala storleken på de filer som finns i en katalog.

Följande tre metoder förklaras. Enheterna för de storlekar som kan erhållas är alla bytes.

  • Få fram storleken på filen:os.path.getsize()
  • Få fram storleken på en katalog genom att kombinera följande funktioner (Python 3.5 eller senare):os.scandir()
  • Kombinera följande funktioner för att få fram storleken på katalogen (Python 3.4 och tidigare):os.listdir()

Få fram storleken på filen: os.path.getsize()

Filens storlek (kapacitet) kan fås med os.path.getsize().

Ange sökvägen till den fil vars storlek du vill få fram som ett argument.

import os

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

Få fram storleken på en katalog (mapp): os.scandir()

Använd os.scandir() för att beräkna den totala storleken på de filer som finns i en katalog (mapp).

Den här funktionen lades till i Python 3.5, så tidigare versioner använder os.listdir(). os.listdir()-exemplet beskrivs senare.

Definiera en funktion på följande sätt.

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() returnerar en iterator av os.DirEntry-objektet.

DirEntry-objekt, använd metoderna is_file() och is_dir() för att avgöra om det är en fil eller en katalog. Om det är en fil erhålls storleken från st_size-attributet i stat_result-objektet. Om det rör sig om en katalog anropas denna funktion rekursivt för att addera alla storlekar och återge den totala storleken.

Dessutom returnerar is_file() som standard TRUE för symboliska länkar till filer. Dessutom returnerar is_dir() sant för symboliska länkar till kataloger. Om du vill ignorera symboliska länkar ställer du in argumentet follow_symlinks för is_file() och is_dir() till false.

Om du inte behöver gå igenom underkatalogerna kan du också ta bort följande del.

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

Ovanstående funktion misslyckas om filens sökväg skickas som ett argument. Om du behöver en funktion som returnerar storleken på en fil eller katalog kan du skriva följande.

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

Få fram storleken på en katalog (mapp): os.listdir()

Det finns ingen os.scandir() i Python 3.4 eller tidigare, så använd os.listdir().

Definiera en funktion på följande sätt.

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

Den grundläggande idén är densamma som i fallet os.scandir().

Det som kan erhållas med os.listdir() är en lista med filnamn (katalognamn). Varje filnamn eller katalognamn sammanfogas med sökvägen till den överordnade katalogen med os.path.join() för att skapa den fullständiga sökvägen.

Om målet är en symbolisk länk kommer os.path.isfile() och os.path.isdir() att bedöma enheten. Så om du vill ignorera symboliska länkar använder du villkorlig bedömning i kombination med os.path.islink(), som returnerar sant för symboliska länkar.

Precis som i fallet os.scandir(), om du inte behöver gå igenom underkatalogerna kan du bara ta bort följande del.

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

Ovanstående funktion misslyckas om filens sökväg skickas som ett argument. Om du behöver en funktion som returnerar storleken på en fil eller katalog kan du skriva följande.

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