Атрыманне памеру файла або каталога (папкі) у Python

Бізнэс

Выкарыстоўваючы OS стандартнай бібліятэкі Python, вы можаце атрымаць памер (ёмістасць) файла або агульны памер файлаў, якія змяшчаюцца ў каталогу.

Наступныя тры метады тлумачацца. Адзінкі памераў, якія можна атрымаць, – гэта ўсе байты.

  • Атрымаць памер файла:os.path.getsize()
  • Атрымаць памер каталога, аб’яднаўшы наступныя функцыі (Python 3.5 або больш позняй версіі):os.scandir()
  • Аб’яднайце наступныя функцыі, каб атрымаць памер каталога (Python 3.4 і раней):os.listdir()

Атрымаць памер файла:os.path.getsize()

Памер (ёмістасць) файла можна атрымаць з дапамогай os.path.getsize().

Укажыце ў якасці аргумента шлях да файла, памер якога вы хочаце атрымаць.

import os

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

Атрымаць памер каталога (папкі):os.scandir()

Каб вылічыць агульны памер файлаў, якія змяшчаюцца ў каталогу (папцы), выкарыстоўвайце os.scandir().

Гэтая функцыя была дададзеная ў Python 3.5, таму ў больш ранніх версіях выкарыстоўваецца os.listdir(). Прыклад os.listdir() апісаны пазней.

Вызначце функцыю наступным чынам.

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() вяртае ітэратар аб’екта os.DirEntry.

Аб’ект DirEntry, выкарыстоўвайце метады is_file() і is_dir(), каб вызначыць, файл гэта ці каталог. Калі гэта файл, памер атрымліваецца з атрыбуту st_size аб’екта stat_result. У выпадку з каталогам гэтая функцыя выклікаецца рэкурсіўна, каб скласці ўсе памеры і вярнуць агульны памер.

Акрамя таго, па змаўчанні is_file() вяртае TRUE для сімвалічных спасылак на файлы. Таксама is_dir() вяртае праўду для сімвалічных спасылак на каталогі. Калі вы хочаце ігнараваць сімвалічныя спасылкі, усталюйце аргумент follow_symlinks is_file() і is_dir() у false.

Акрамя таго, калі вам не трэба пераходзіць па падкаталогах, вы можаце проста выдаліць наступную частку.

            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()

У Python 3.4 або ранейшай версіі os.scandir() няма, таму выкарыстоўвайце os.listdir().

Вызначце функцыю наступным чынам.

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

Асноўная ідэя такая ж, як і ў выпадку os.scandir().

З дапамогай os.listdir() можна атрымаць спіс імёнаў файлаў (імён каталогаў). Кожнае імя файла або імя каталога злучаецца з шляхам да бацькоўскага каталога з дапамогай os.path.join(), каб стварыць поўны шлях.

Калі мэта – сімвалічная спасылка, os.path.isfile() і os.path.isdir() будуць судзіць аб’ект. Такім чынам, калі вы хочаце ігнараваць сімвалічныя спасылкі, выкарыстоўвайце ўмоўнае меркаванне ў спалучэнні з os.path.islink(), які вяртае праўду для сімвалічных спасылак.

Як і ў выпадку з os.scandir(), калі вам не трэба пераходзіць па падкаталогах, проста выдаліце ​​наступную частку.

        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
Copied title and URL