Að fá stærð skráar eða möppu (möppu) í Python

Viðskipti

Með því að nota Python staðlaða bókasafnskerfið geturðu fengið stærð (getu) skráar eða heildarstærð skráanna sem eru í möppu.

Eftirfarandi þrjár aðferðir eru útskýrðar. Stærðareiningarnar sem hægt er að fá eru allar bæti.

  • Fáðu stærðina á skránni:os.path.getsize()
  • Fáðu stærð möppu með því að sameina eftirfarandi aðgerðir (Python 3.5 eða nýrri):os.scandir()
  • Sameina eftirfarandi aðgerðir til að fá stærð möppunnar (Python 3.4 og eldri):os.listdir()

Fáðu stærðina á skránni:os.path.getsize()

Stærð (getu) skráarinnar er hægt að fá með os.path.getsize().

Gefðu upp slóð skráarinnar sem þú vilt fá sem rök.

import os

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

Fáðu stærð möppu (möppu):os.scandir()

Til að reikna út heildarstærð skránna sem eru í möppu (möppu), notaðu os.scandir().

Þessari aðgerð var bætt við í Python 3.5, þannig að fyrri útgáfur nota os.listdir(). os.listdir() dæmi er lýst síðar.

Skilgreindu fall sem hér segir.

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() skilar endurtekningu af os.DirEntry hlutnum.

DirEntry hlut, notaðu is_file() og is_dir() aðferðirnar til að ákvarða hvort það er skrá eða mappa. Ef það er skrá er stærðin fengin úr st_size eigindinni á stat_result hlutnum. Þegar um möppu er að ræða er þessi aðgerð kölluð endurkvæmt til að leggja saman allar stærðir og skila heildarstærðinni.

Að auki, sjálfgefið, skilar is_file() TRUE fyrir táknræna tengla á skrár. Einnig, is_dir() skilar satt fyrir táknræna tengla á möppur. Ef þú vilt hunsa táknræna tengla skaltu stilla follow_symlinks rökin fyrir is_file() og is_dir() á false.

Einnig, ef þú þarft ekki að fara yfir undirmöppurnar, geturðu bara eytt eftirfarandi hluta.

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

Ofangreind aðgerð mun mistakast ef slóð skráarinnar er send sem rök. Ef þú þarft aðgerð til að skila stærð skráar eða möppu geturðu skrifað eftirfarandi.

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áðu stærð möppu (möppu):os.listdir()

Það er ekkert os.scandir() í Python 3.4 eða eldri, svo notaðu os.listdir().

Skilgreindu fall sem hér segir.

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

Grunnhugmyndin er sú sama og í tilfelli os.scandir().

Það sem hægt er að fá með os.listdir() er listi yfir skráarnöfn (möppunöfn). Hvert skráarnafn eða möppuheiti er tengt við slóð móðurskrárinnar með os.path.join() til að búa til alla slóðina.

Ef markið er táknrænn hlekkur munu os.path.isfile() og os.path.isdir() dæma eininguna. Svo, ef þú vilt hunsa táknræna tengla, notaðu skilyrta dóma ásamt os.path.islink(), sem skilar satt fyrir táknræna tengla.

Eins og í tilfelli os.scandir(), ef þú þarft ekki að fara yfir undirmöppurnar skaltu bara eyða eftirfarandi hluta.

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

Ofangreind aðgerð mun mistakast ef slóð skráarinnar er send sem rök. Ef þú þarft aðgerð til að skila stærð skráar eða möppu geturðu skrifað eftirfarandi.

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