Как узнать размер файла и папки: единицы измерения и способы

Как узнать размер файла и папки: единицы измерения и способы Полезное

Размер файла — это объем данных, которые он содержит, измеренный в байтах. Рядом всегда есть вторая величина — размер на диске: сколько места файл реально занимает на носителе. Они различаются, потому что файловая система выделяет место блоками (кластерами), а не побайтно. Ниже разберем единицы измерения (бит, байт, КБ и КиБ), разницу двух размеров и то, как узнать объем файла и папки в Windows, Linux и macOS, а также программно на Python.

Бит и байт: с чего все считается

Бит — минимальная единица информации, принимает значение 0 или 1. Байт — группа битов, которой адресуется память. В современных системах 1 байт = 8 бит (такой байт называют октетом). Байт — это базовая единица, в которой измеряют размер файла: все более крупные единицы (килобайт, мегабайт) — это кратные байта.

Бит используют для скорости передачи, байт — для размера. Отсюда путаница: интернет-канал «100 Мбит/с» — это мегабиты в секунду, а не мегабайты. Чтобы получить скорость загрузки в мегабайтах, делят примерно на 8: 100 Мбит/с — это около 12,5 МБ/с.

КБ против КиБ: почему 1000 и 1024 — это разные вещи

Здесь кроется главная причина, по которой «размер флешки не совпадает». Есть две системы приставок.

Десятичная (СИ): приставки кило-, мега-, гига- означают степени 1000. Двоичная (IEC): приставки киби-, меби-, гиби- означают степени 1024. Двоичные единицы придумали именно чтобы развести смыслы, но в быту и в некоторых ОС до сих пор пишут «КБ», подразумевая 1024.

Приставка Десятичная (СИ) Двоичная (IEC)
кило кБ = 1000 Б КиБ = 1024 Б
мега МБ = 1 000 000 Б МиБ = 1 048 576 Б
гига ГБ = 1 000 000 000 Б ГиБ = 1 073 741 824 Б
тера ТБ = 10^12 Б ТиБ = 1024^4 Б

Практический вывод. Производители накопителей считают в десятичных единицах: диск «1 ТБ» — это 10^12 байт. Windows же показывает объем в двоичных единицах, но подписывает их как «ГБ». Поэтому диск на 1 ТБ в проводнике выглядит как примерно 931 ГБ: 10^12 / 1024^3 = 931,32. Файл никуда не делся — это разница систем счета, а не потеря места.

Размер и размер на диске: при чем тут кластер

Логический размер — это точное число байт в файле. Размер на диске — это место, которое файловая система под него выделила. Диск размечен на кластеры (в терминах Linux — блоки) фиксированной длины, и файл занимает целое число кластеров, округленное вверх.

Пример: текстовый файл из 10 байт на томе NTFS с кластером 4 КиБ займет на диске целых 4096 байт — один кластер целиком. Тысяча таких мелких файлов «весит» 10 КБ по содержимому, но отъедает около 4 МБ места. Обратная ситуация тоже бывает: сжатые тома и разреженные (sparse) файлы могут занимать на диске меньше логического размера.

Размер кластера по умолчанию зависит от файловой системы и размера тома (для типичных томов NTFS это 4 КиБ). Точное значение см. в разделе «Точки для фактчека».

Как посмотреть размер в Windows, Linux и macOS

Через графический интерфейс:

  • Windows: правой кнопкой по файлу -> «Свойства» -> вкладка «Общие». Там две строки: «Размер» (логический) и «Размер на диске».
  • macOS: правой кнопкой (или Cmd+I) -> «Свойства» (Get Info). Поле «Размер» показывает и логический объем, и место на диске в скобках.
  • Linux: в файловом менеджере (Nautilus, Dolphin) — «Свойства» контекстного меню.

Через терминал точный размер в байтах удобнее и однозначнее:

ОС Точный размер в байтах Человекочитаемо
Windows (PowerShell) (Get-Item file.txt).Length —
Linux stat -c%s file.txt ls -lh file.txt
macOS stat -f%z file.txt ls -lh file.txt

Обратите внимание: stat в Linux (GNU) и macOS (BSD) — разные утилиты с разным синтаксисом, поэтому флаги отличаются (-c%s против -f%z).

Для папок и оценки места на диске используют du:

du -sh mydir      # суммарное место на диске, человекочитаемо (обычно по 1024)
du -sb file.txt   # логический размер в байтах (GNU du, Linux)

Флаг -b (то же, что --apparent-size --block-size=1) есть в GNU du из Linux; в BSD du на macOS его нет, там для логического размера берут stat -f%z. По умолчанию du показывает именно место на диске (блоки), а не сумму содержимого — это и есть разница «размер на диске» против «размера».

Как узнать размер файла на Python

Начнем с минимального полного примера, который можно скопировать и запустить. Он создает файл известного размера и читает его объем:

import os

# создаем файл из 2500 ASCII-символов; в UTF-8 это ровно 2500 байт
with open("demo.txt", "w", encoding="utf-8") as f:
    f.write("A" * 2500)

print(os.path.getsize("demo.txt"))   # 2500

Функция os.path.getsize() возвращает логический размер в байтах. Тот же результат дает os.stat() через поле st_size — это удобно, когда нужны и другие атрибуты файла:

import os

st = os.stat("demo.txt")
print(st.st_size)   # 2500 - логический размер, байты

Место на диске Python тоже умеет показывать, но через блоки, и только на Unix-подобных системах (Linux, macOS). Поле st_blocks считает 512-байтные блоки независимо от реального размера кластера:

import os

st = os.stat("demo.txt")
print(st.st_blocks * 512)   # место на диске в байтах (Linux/macOS; на Windows st_blocks нет)

Чтобы перевести байты в человекочитаемый вид, важно выбрать систему приставок. Ниже — двоичная (КиБ, МиБ):

def human_binary(n):
    units = ["Б", "КиБ", "МиБ", "ГиБ", "ТиБ"]
    size = float(n)
    for unit in units:
        if size < 1024 or unit == units[-1]:
            return f"{size:.1f} {unit}"
        size /= 1024

print(human_binary(2500))   # 2.4 КиБ  (2500 / 1024 = 2.44)

Размер папки в Python — это сумма размеров всех файлов внутри. Обходим дерево через os.walk() и складываем логические размеры, пропуская символические ссылки, чтобы не считать один файл дважды:

import os

def dir_size(root):
    total = 0
    for dirpath, _dirs, files in os.walk(root):
        for name in files:
            path = os.path.join(dirpath, name)
            if not os.path.islink(path):
                total += os.path.getsize(path)
    return total

print(dir_size("."))   # сумма логических размеров файлов, байты

Такой подсчет дает логический объем (аналог du --apparent-size), а не место на диске. Для места на диске в цикле суммируют os.stat(path).st_blocks * 512 вместо getsize — и снова только на Unix.

Если размер выглядит странно

  • У ярлыка или ссылки размер почти нулевой. Это нормально: ярлык хранит путь, а не сам файл. Смотрите размер целевого файла.
  • Размер папки долго считается. Система обходит все вложенные файлы; для сетевых дисков это медленно. Дождитесь окончания подсчета.
  • Размер на диске меньше логического. Скорее всего включено сжатие тома или это разреженный файл — так и должно быть.
  • Флешка «меньше заявленной». Производитель считал в десятичных ГБ, ОС показывает двоичные ГиБ. Плюс часть занимает служебная разметка.
  • Заархивированный файл почти не уменьшился. Внутри уже сжатые данные (см. FAQ).

Выводы

  • Базовая единица размера — байт (8 бит); все крупные единицы кратны ему, а бит используют для скорости, а не объема.
  • Ключевая путаница — приставки: кБ/МБ/ГБ по СИ это степени 1000, а КиБ/МиБ/ГиБ по IEC это степени 1024; отсюда «1 ТБ = 931 ГиБ».
  • Логический размер и размер на диске — разные величины: файл занимает целое число кластеров, поэтому мелкий файл на диске «весит» как целый кластер.
  • Посмотреть размер можно в свойствах файла или в терминале: stat, ls -lh, du на Linux/macOS и (Get-Item).Length в PowerShell.
  • На Python логический размер дает os.path.getsize() или st_size, место на диске — st_blocks * 512 (только Unix), размер папки — сумма по os.walk().

Где применяется / связь с практикой

Освойте тему на практике

Ручной подсчет годится для одного файла, но как только нужно проверить сотни файлов, найти самые тяжелые в проекте или собрать отчет по занятому месту, задачу решают скриптом. Именно os, os.path, pathlib и обход дерева каталогов — тот набор, с которого начинается автоматизация работы с файловой системой. Разобраться в нем системно помогает курс Python Basic: там разбирают работу с файлами, строками и модулями стандартной библиотеки на практических задачах.

Освойте тему на практике

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

FAQ

Почему скорость интернета в мегабитах, а размер файла в мегабайтах?
Скорость передачи исторически измеряют в битах в секунду (Мбит/с), а объем данных — в байтах. Чтобы прикинуть, за сколько скачается файл, размер в мегабайтах умножают примерно на 8 и делят на скорость канала в мегабитах.

Почему архив иногда почти не уменьшает файл?
Архиваторы сжимают за счет повторов и избыточности. Форматы вроде JPG, MP4, MP3 или PDF уже сжаты внутри, поэтому zip или rar поверх них дает выигрыш в единицы процентов, а иногда чуть увеличивает размер за счет служебных данных.

Сколько занимает пустой файл или файл из одного символа?
Логически пустой файл — это 0 байт, а файл из одной латинской буквы в UTF-8 — 1 байт. Но на диске оба займут минимум один кластер (например, 4 КиБ на NTFS), поэтому размер на диске будет заметно больше содержимого.

OTUS Журнал
Скидка 5% 12-19 октября на курсы (popup)
Бесплатные открытые уроки (поп-ап)