Получение размера файла или каталога (папки) в Python

Бизнес

Используя стандартную библиотеку Python os, вы можете получить размер (емкость) файла или общий размер файлов, содержащихся в каталоге.

Ниже описаны три метода. Единицы измерения размеров, которые могут быть получены, — все байты.

  • Получить размер файла: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() возвращает true для символических ссылок на каталоги. Если вы хотите игнорировать символические ссылки, установите аргумент 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(), которая возвращает true для символических ссылок.

Как и в случае с 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