Получаване на размера на файл или директория (папка) в 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