Kupata saizi ya faili au saraka (folda) kwenye Python

Biashara

Kutumia os ya maktaba ya kawaida ya Python, unaweza kupata saizi (uwezo) wa faili au saizi ya jumla ya faili zilizomo kwenye saraka.

Njia tatu zifuatazo zimefafanuliwa. Vitengo vya saizi ambazo zinaweza kupatikana ni kaiti zote.

  • Pata saizi ya faili:os.path.getsize()
  • Pata saizi ya saraka kwa kuchanganya kazi zifuatazo (Python 3.5 au baadaye):os.scandir()
  • Changanya kazi zifuatazo ili kupata saizi ya saraka (Python 3.4 na mapema):os.listdir()

Pata saizi ya faili:os.path.getsize()

Ukubwa (uwezo) wa faili unaweza kupatikana kwa os.path.getsize().

Toa njia ya faili ambayo saizi yake unataka kupata kama hoja.

import os

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

Pata saizi ya saraka (folda):os.scandir()

Ili kuhesabu saizi ya jumla ya faili zilizomo kwenye saraka (folda), tumia os.scandir().

Kazi hii iliongezwa katika Python 3.5, kwa hivyo matoleo ya awali hutumia os.listdir(). os.listdir() mfano umeelezewa baadaye.

Bainisha chaguo za kukokotoa kama ifuatavyo.

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() hurejesha kiboreshaji cha kitu cha os.DirEntry.

Kitu cha DirEntry, tumia njia za is_file() na is_dir() kuamua ikiwa ni faili au saraka. Ikiwa ni faili, saizi hupatikana kutoka kwa sifa ya st_size ya kitu cha matokeo_ya takwimu. Katika kesi ya saraka, kazi hii inaitwa kujirudia ili kuongeza saizi zote na kurudisha saizi ya jumla.

Kwa kuongeza, kwa chaguo-msingi, is_file() inarudisha TRUE kwa viungo vya mfano kwa faili. Pia, is_dir() inarudi kweli kwa viungo vya mfano kwa saraka. Ikiwa ungependa kupuuza viungo vya ishara, weka hoja ya follow_symlinks ya is_file() na is_dir() kuwa sivyo.

Pia, ikiwa hauitaji kupitisha subdirectories, unaweza tu kufuta sehemu ifuatayo.

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

Kazi iliyo hapo juu itashindwa ikiwa njia ya faili itapitishwa kama hoja. Ikiwa unahitaji kitendakazi ili kurudisha saizi ya faili au saraka, unaweza kuandika yafuatayo.

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

Pata saizi ya saraka (folda):os.listdir()

Hakuna os.scandir() kwenye Python 3.4 au mapema, kwa hivyo tumia os.listdir().

Bainisha chaguo za kukokotoa kama ifuatavyo.

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

Wazo la msingi ni sawa na katika kesi ya os.scandir().

Kinachoweza kupatikana na os.listdir() ni orodha ya majina ya faili (majina ya saraka). Kila jina la faili au jina la saraka huunganishwa na njia ya saraka kuu na os.path.join() ili kuunda njia kamili.

Ikiwa lengo ni kiungo cha ishara, os.path.isfile() na os.path.isdir() itahukumu huluki. Kwa hivyo, ikiwa unataka kupuuza viungo vya mfano, tumia hukumu ya masharti pamoja na os.path.islink(), ambayo inarudi kweli kwa viungo vya mfano.

Kama ilivyo kwa os.scandir(), ikiwa hauitaji kupita subdirectories, futa tu sehemu ifuatayo.

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

Kazi iliyo hapo juu itashindwa ikiwa njia ya faili itapitishwa kama hoja. Ikiwa unahitaji kitendakazi ili kurudisha saizi ya faili au saraka, unaweza kuandika yafuatayo.

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