Добијање величине датотеке или директоријума (фолдера) у Питхон-у

Бусинесс

Користећи ОС стандардне библиотеке Питхон, можете добити величину (капацитет) датотеке или укупну величину датотека садржаних у директоријуму.

Објашњене су следеће три методе. Јединице величина које се могу добити су сви бајтови.

  • Добијте величину датотеке:os.path.getsize()
  • Добијте величину директоријума комбиновањем следећих функција (Питхон 3.5 или новији):os.scandir()
  • Комбинујте следеће функције да бисте добили величину директоријума (Питхон 3.4 и раније):os.listdir()

Добијте величину датотеке:os.path.getsize()

Величина (капацитет) датотеке се може добити помоћу ос.патх.гетсизе().

Наведите путању датотеке чију величину желите да добијете као аргумент.

import os

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

Добијте величину директоријума (фолдера):os.scandir()

Да бисте израчунали укупну величину датотека садржаних у директоријуму (фолдеру), користите ос.сцандир().

Ова функција је додата у Питхон 3.5, тако да старије верзије користе ос.листдир(). Пример ос.листдир() је описан касније.

Дефинишите функцију на следећи начин.

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

ос.сцандир() враћа итератор ос.ДирЕнтри објекта.

ДирЕнтри објекат, користите методе ис_филе() и ис_дир() да одредите да ли је то датотека или директоријум. Ако је у питању датотека, величина се добија из атрибута ст_сизе објекта стат_ресулт. У случају директоријума, ова функција се позива рекурзивно да сабере све величине и врати укупну величину.

Поред тога, подразумевано, ис_филе() враћа ТРУЕ за симболичке везе до датотека. Такође, ис_дир() враћа труе за симболичке везе ка директоријумима. Ако желите да занемарите симболичке везе, поставите аргумент фоллов_симлинкс за ис_филе() и ис_дир() на фалсе.

Такође, ако не морате да прелазите кроз поддиректоријуме, можете само да избришете следећи део.

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

Горња функција неће успети ако се путања датотеке проследи као аргумент. Ако вам је потребна функција за враћање величине датотеке или директоријума, можете написати следеће.

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

Добијте величину директоријума (фолдера):os.listdir()

Не постоји ос.сцандир() у Питхон-у 3.4 или раније, па користите ос.листдир().

Дефинишите функцију на следећи начин.

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

Основна идеја је иста као у случају ос.сцандир().

Оно што се може добити помоћу ос.листдир() је листа имена датотека (имена директоријума). Свако име датотеке или име директоријума се спаја са путањом родитељског директоријума помоћу ос.патх.јоин() да би се креирала пуна путања.

Ако је циљ симболичка веза, ос.патх.исфиле() и ос.патх.исдир() ће проценити ентитет. Дакле, ако желите да занемарите симболичке везе, користите условно расуђивање у комбинацији са ос.патх.ислинк(), који враћа труе за симболичке везе.

Као иу случају ос.сцандир(), ако не морате да прелазите кроз поддиректоријуме, само избришите следећи део.

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

Горња функција неће успети ако се путања датотеке проследи као аргумент. Ако вам је потребна функција за враћање величине датотеке или директоријума, можете написати следеће.

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