Faili või kataloogi (kausta) suuruse saamine Pythonis

Äri

Pythoni standardraamatukogu os abil saate teada faili suuruse (mahu) või kataloogis sisalduvate failide kogumahu.

Järgnevalt selgitatakse kolme meetodit. Saadavate suuruste ühikud on kõik baidid.

  • Saada faili suurus:os.path.getsize()
  • Saada kataloogi suurus, kombineerides järgmisi funktsioone (Python 3.5 või uuem):os.scandir()
  • Kombineeri järgmised funktsioonid, et saada kataloogi suurus (Python 3.4 ja varasemad versioonid):os.listdir()

Saada faili suurus: os.path.getsize()

Faili suuruse (mahu) saab teada os.path.getsize() abil.

Andke argumendina selle faili tee, mille suurust soovite saada.

import os

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

Saada kataloogi (kausta) suurus: os.scandir()

Kataloogis (kaustas) sisalduvate failide kogumahu arvutamiseks kasutage funktsiooni os.scandir().

See funktsioon lisati Python 3.5-s. Varasemad versioonid kasutavad funktsiooni os.listdir(). os.listdir() näide on kirjeldatud hiljem.

Määrake funktsioon järgmiselt.

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() tagastab os.DirEntry objekti iteraatori.

DirEntry objekt, kasutage meetodeid is_file() ja is_dir(), et määrata, kas tegemist on faili või kataloogiga. Kui tegemist on failiga, saadakse suurus stat_result-objekti atribuudist st_size. Kui tegemist on kataloogiga, kutsutakse seda funktsiooni rekursiivselt, et liita kõik suurused kokku ja tagastada kogusuurus.

Lisaks tagastab is_file() vaikimisi failide sümboolsete linkide puhul TRUE. Samuti tagastab is_dir() true sümboolsete linkide puhul kataloogidele. Kui soovite sümboolseid linke ignoreerida, siis seadke is_file() ja is_dir() argumentide follow_symlinks väärtuseks false.

Samuti, kui teil ei ole vaja läbida alamkatalooge, võite lihtsalt kustutada järgmise osa.

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

Ülaltoodud funktsioon ebaõnnestub, kui faili tee on esitatud argumendina. Kui teil on vaja funktsiooni, mis tagastab faili või kataloogi suuruse, võite kirjutada järgmise.

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

Saada kataloogi (kausta) suurus: os.listdir()

Python 3.4 või varasemates versioonides puudub os.scandir(), seega kasutage os.listdir().

Määrake funktsioon järgmiselt.

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

Põhiidee on sama, mis os.scandir() puhul.

Os.listdir() abil saab failinimede (kataloogide nimede) nimekirja. Iga failinimi või katalooginimi ühendatakse os.path.join() abil vanemkataloogi teega, et luua täielik tee.

Kui sihtmärk on sümboolne link, siis os.path.isfile() ja os.path.isdir() otsustavad üksuse üle. Seega, kui soovite sümboolseid linke ignoreerida, kasutage tingimuslikku otsustamist koos os.path.islink() funktsiooniga, mis tagastab sümboolsete linkide puhul true.

Nagu ka os.scandir() puhul, kui sul ei ole vaja läbida alamkatalooge, kustuta lihtsalt järgmine osa.

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

Ülaltoodud funktsioon ebaõnnestub, kui faili tee on esitatud argumendina. Kui teil on vaja funktsiooni, mis tagastab faili või kataloogi suuruse, võite kirjutada järgmise.

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