Как измерить размер файла в Python

Раздел: Работа с файлами -> Работа с файлами

Основные способы получения размера файла в Python

Наиболее эффективное решение: os.path.getsize(path)

Функция os.path.getsize(path) возвращает размер файла в байтах. Это прямой и быстрый способ, который использует системный вызов stat.


import os

file_path = 'data.txt'
size = os.path.getsize(file_path)
print(f"Размер файла: {size} байт")
  

путь к path python (путь к python (переменная path))

Если файл не существует, возникает исключение FileNotFoundError. Для обработки ошибок используется конструкция try/except.

Типичные проблемы:

  • Путь содержит неверный разделитель (например, обратную косую черту в Windows без экранирования). Решение: использовать raw-строки r'C:\path\file' или модуль pathlib.
  • Отсутствие прав на чтение файла - возникает PermissionError.

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

Как получить размер файла с помощью os.stat?

Функция os.stat(path) возвращает объект с метаданными файла, включая поле st_size.


import os

stat_info = os.stat('data.txt')
size = stat_info.st_size
print(f"Размер: {size} байт")
  

Python pathlib path (использование pathlib в python)

Этот метод дает доступ и к другим атрибутам (время изменения, права доступа).

Ошибки те же: FileNotFoundError, PermissionError. Дополнительно - если путь ведет к символической ссылке, os.stat следует за ней (аналог stat).

Случаи использования: когда кроме размера нужны другие метаданные, например, для кэширования.

Как использовать pathlib для определения размера файла?

Объектно-ориентированный подход: Path.stat().st_size.


from pathlib import Path

file = Path('data.txt')
size = file.stat().st_size
print(f"Размер: {size} байт")
  

Path python 2 (путь к python 2)

Path автоматически обрабатывает разделители, поддерживает Unix и Windows.

Для несуществующего пути - FileNotFoundError. Символические ссылки разрешаются по умолчанию.

Цель: современный код с удобной цепочкой методов, интеграция с другими операциями pathlib (переименование, проверка существования).

Как узнать размер уже открытого файла с помощью os.fstat?

Если файл уже открыт (дескриптор), функция os.fstat(fd) работает без лишнего поиска по пути.


import os

with open('data.txt', 'rb') as f:
    fd = f.fileno()
    stat_info = os.fstat(fd)
    size = stat_info.st_size
    print(f"Размер открытого файла: {size} байт")
  

Python site packages path (путь к site-packages в python)

Это снижает накладные расходы, если файл уже в памяти.

Дескриптор должен быть действительным. После закрытия файла дескриптор становится недействительным, вызов os.fstat приведет к OSError.

Случаи: чтение больших файлов частями, когда путь заранее не сохранен.

Как вычислить размер файла без помощи модуля os?

Перемещением указателя в конец и чтением позиции: seek(0, 2) и tell().


with open('data.txt', 'rb') as f:
    f.seek(0, 2)  # перейти в конец файла
    size = f.tell()
    print(f"Размер: {size} байт")
  

установка path python (настройка переменной path для python)

Подходит для бинарных и текстовых файлов (в текстовом режиме могут быть проблемы с кодировкой).

Для текстовых файлов в Windows с \r\n tell() может вернуть некорректное значение, так как пары символов могут учитываться по-разному. Лучше использовать бинарный режим.

Цель: демонстрация внутреннего механизма, когда недоступен модуль os (редко, но полезно для понимания).

Как получить размеры всех файлов в директории?

Комбинируем обход каталога с os.path.getsize или Path.stat.


import os

directory = '.'
for filename in os.listdir(directory):
    full_path = os.path.join(directory, filename)
    if os.path.isfile(full_path):
        size = os.path.getsize(full_path)
        print(f"{filename}: {size} байт")
  

Можно использовать pathlib.glob для фильтрации.

При большом количестве файлов операция может быть медленной. Рекомендуется кэшировать результаты или использовать scandir.

Цель: анализ дискового пространства, сбор статистики.

- File does not exist python (проверка существования файла)
- Python path configuration (конфигурация путей python)
- Python installation path (путь установки python)

Расширенные примеры работы с размером файла

Обработка больших файлов (>2 ГБ)

На 32-битных системах os.path.getsize может возвращать значение с ограничением. В современных 64-битных версиях Python этой проблемы нет. Для надежности используется os.path.getsize или os.stat.

Пример

import os

large_file = 'bigfile.bin'
try:
    size = os.path.getsize(large_file)
    print(f"Размер: {size} байт ({size / (1024**3):.2f} ГБ)")
except OSError as e:
    print(f"Ошибка: {e}")
Размер: 4294967296 байт (4.00 ГБ)

Рекурсивное получение размеров всех файлов в поддиректориях

С помощью os.walk или Path.rglob.

Пример

from pathlib import Path

root = Path('.')
total = 0
for file in root.rglob('*'):
    if file.is_file():
        total += file.stat().st_size
print(f"Общий размер дерева: {total / (1024**2):.2f} МБ")
Общий размер дерева: 234.56 МБ

Вывод размера в удобных единицах (КБ, МБ, ГБ)

Пример

def human_readable_size(size_bytes):
    units = ['Б', 'КБ', 'МБ', 'ГБ', 'ТБ']
    for unit in units:
        if size_bytes < 1024:
            return f"{size_bytes:.2f} {unit}"
        size_bytes /= 1024
    return f"{size_bytes:.2f} ПБ"

import os
size = os.path.getsize('data.txt')
print(human_readable_size(size))
1.23 МБ

Получение размера файла по ссылке (символическая ссылка)

Используйте os.lstat для получения информации о самой ссылке, а не о целе.

Пример

import os

link_path = 'my_link'
try:
    stat_info = os.lstat(link_path)
    # Если это ссылка, st_size - это длина имени целевого файла
    print(f"Размер ссылки (длина пути): {stat_info.st_size} байт")
    # Реальный размер цели:
    real_size = os.path.getsize(link_path)  # следует за ссылкой
    print(f"Размер целевого файла: {real_size} байт")
except OSError as e:
    print(f"Ошибка: {e}")
Размер ссылки (длина пути): 8 байт
Размер целевого файла: 1024 байт

Получение размера файла из строки с unicode-символами

Пример

from pathlib import Path

path = Path('файл_с_кириллицей.txt')
if path.exists():
    size = path.stat().st_size
    print(f"Размер файла с юникодом: {size}")
Размер файла с юникодом: 512

Бенчмарк: сравнение os.path.getsize и pathlib.Path.stat

Пример

import timeit
import os
from pathlib import Path

file = 'test.dat'

# подготовка: создать пустой файл
open(file, 'w').close()

time_os = timeit.timeit("os.path.getsize(file)", globals=globals(), number=100000)
time_pathlib = timeit.timeit("Path(file).stat().st_size", globals=globals(), number=100000)

print(f"os.path.getsize: {time_os:.4f} сек")
print(f"Path.stat: {time_pathlib:.4f} сек")
os.remove(file)
os.path.getsize: 0.2345 сек
Path.stat: 0.4567 сек

os.path.getsize обычно быстрее, но pathlib удобнее при цепочке операций.

Получение размера файла (os.path.getsize) в Python - comments

En
Python file size (python)