Pridobivanje velikosti datoteke ali imenika (mape) v programu Python

Posel

Z uporabo Pythonove standardne knjižnice os lahko dobite velikost (zmogljivost) datoteke ali skupno velikost datotek v imeniku.

Razloženi so naslednji trije načini. Enote velikosti, ki jih je mogoče dobiti, so vsi bajti.

  • Pridobite velikost datoteke:os.path.getsize()
  • Velikost imenika dobite s kombinacijo naslednjih funkcij (Python 3.5 ali novejši):os.scandir()
  • Za določitev velikosti imenika združite naslednje funkcije (Python 3.4 in starejše):os.listdir()

Pridobite velikost datoteke: os.path.getsize()

Velikost (zmogljivost) datoteke lahko dobite z os.path.getsize().

Kot argument navedite pot do datoteke, katere velikost želite pridobiti.

import os

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

Pridobite velikost imenika (mape): os.scandir()

Če želite izračunati skupno velikost datotek v imeniku (mapi), uporabite os.scandir().

Ta funkcija je bila dodana v Pythonu 3.5, zato prejšnje različice uporabljajo os.listdir(). primer os.listdir() je opisan kasneje.

Opredelite funkcijo na naslednji način.

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() vrne iterator objekta os.DirEntry.

DirEntry uporabite metodi is_file() in is_dir(), da ugotovite, ali gre za datoteko ali imenik. Če gre za datoteko, se velikost pridobi iz atributa st_size objekta stat_result. Če gre za imenik, se ta funkcija rekurzivno pokliče, da sešteje vse velikosti in vrne skupno velikost.

Poleg tega funkcija is_file() privzeto vrne TRUE za simbolne povezave do datotek. Tudi is_dir() vrne true za simbolne povezave do imenikov. Če želite prezreti simbolne povezave, nastavite argument follow_symlinks v is_file() in is_dir() na false.

Če vam ni treba brskati po podimenikih, lahko izbrišete naslednji del.

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

Zgornja funkcija bo neuspešna, če je kot argument posredovana pot do datoteke. Če potrebujete funkcijo, ki bo vrnila velikost datoteke ali imenika, lahko napišete naslednje.

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

Pridobite velikost imenika (mape): os.listdir()

V Pythonu 3.4 ali starejših ni funkcije os.scandir(), zato uporabite os.listdir().

Opredelite funkcijo na naslednji način.

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

Osnovna ideja je enaka kot v primeru os.scandir().

S funkcijo os.listdir() lahko dobite seznam imen datotek (imen imenikov). Vsako ime datoteke ali imenika se združi s potjo nadrejenega imenika z os.path.join(), da se ustvari celotna pot.

Če je cilj simbolna povezava, bosta os.path.isfile() in os.path.isdir() presodila entiteto. Če torej želite prezreti simbolne povezave, uporabite pogojno presojo v kombinaciji z os.path.islink(), ki vrne true za simbolne povezave.

Tako kot v primeru os.scandir(), če vam ni treba brskati po podimenikih, preprosto izbrišite naslednji del.

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

Zgornja funkcija bo neuspešna, če je kot argument posredovana pot do datoteke. Če potrebujete funkcijo, ki bo vrnila velikost datoteke ali imenika, lahko napišete naslednje.

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