Home » Как получить размер файла в Python
Как получить размер файла в Python

Как получить размер файла в Python

Сегодня разберёмся, как получить размер файла в Python — быстро, надёжно и без лишней магии. Казалось бы, задача тривиальная, но на практике нюансов хватает: от кроссплатформенности до работы с огромными логами, которые вырастают на сервере быстрее, чем вы успеваете сказать “tail -f”. Эта статья — не просто справка по os.path.getsize(), а гайд для тех, кто хочет автоматизировать рутину, мониторить место на диске, строить отчёты и не попадать в ловушки, которые поджидают даже опытных админов. Погнали!

Как это работает?

В Python есть несколько способов узнать размер файла. Самый популярный — использовать стандартную библиотеку os, а именно функцию os.path.getsize(). Она возвращает размер файла в байтах. Но это только вершина айсберга: есть нюансы с симлинками, правами доступа, работой на разных ОС и даже с файлами, которые растут прямо во время чтения (привет, логи nginx и postgresql).

  • os.path.getsize(path) — возвращает размер файла по указанному пути.
  • os.stat(path).st_size — альтернативный способ, через системный вызов stat.
  • pathlib.Path(path).stat().st_size — современный питоновский путь, красиво и читаемо.

Все эти методы работают примерно одинаково: под капотом они делают системный вызов (на Linux — stat), который возвращает метаданные файла, включая размер. Но есть детали: например, если файл — это симлинк, os.path.getsize() вернёт размер того, на что указывает ссылка, а не самой ссылки. А если у вас нет прав на файл — получите OSError.

Как быстро и просто всё настроить?

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


import os

# Простой способ
size = os.path.getsize('/var/log/syslog')
print(f"Размер файла: {size} байт")

# Через pathlib (Python 3.4+)
from pathlib import Path
size = Path('/var/log/syslog').stat().st_size
print(f"Размер файла: {size} байт")

# Получить размеры всех файлов в директории (без симлинков)
def get_dir_size(path):
total = 0
for dirpath, dirnames, filenames in os.walk(path):
for f in filenames:
fp = os.path.join(dirpath, f)
if not os.path.islink(fp):
total += os.path.getsize(fp)
return total

print(f"Размер каталога /var/log: {get_dir_size('/var/log')} байт")

Если хочется мониторить размер файлов на лету (например, чтобы не переполнить диск логами), можно встроить этот код в cron-скрипт или использовать его в связке с системой мониторинга (например, отправлять алерты в Telegram, если размер файла превышает лимит).

Примеры, схемы, практические советы

Метод Плюсы Минусы Когда использовать
os.path.getsize() Просто, быстро, стандартная библиотека Не работает с файлами, к которым нет доступа; не различает симлинки Быстрые скрипты, однократные проверки
os.stat().st_size Гибко, можно получить другие метаданные Чуть сложнее синтаксис Когда нужны права, время изменения и т.д.
pathlib.Path().stat().st_size Современно, удобно, кроссплатформенно Требует Python 3.4+ Новые проекты, читаемый код
os.walk() + getsize() Можно считать размер каталога, фильтровать файлы Медленно на больших каталогах Анализ больших директорий, отчёты

Положительный кейс: Автоматизация отчёта по размеру логов. Скрипт раз в сутки пробегает по /var/log, считает размер каждого файла, отправляет отчёт на почту. Если какой-то файл превышает лимит — удаляет или архивирует его.

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

Команды и утилиты

Иногда проще (и быстрее) получить размер файла или каталога через системные утилиты, а не через Python. Например:


# Получить размер файла в байтах
stat --format=%s /var/log/syslog

# Получить размер каталога в человекочитаемом виде
du -sh /var/log

# Использовать в Python через subprocess
import subprocess
size = int(subprocess.check_output(['stat', '--format=%s', '/var/log/syslog']))
print(size)

Если нужно работать с удалёнными файлами (например, на SFTP или AWS S3), используйте соответствующие библиотеки:

  • paramiko — для SFTP, метод sftp.stat().st_size
  • boto3 — для S3, метод obj.content_length

Статистика и сравнение с другими решениями

Почему не использовать bash-скрипты или сторонние утилиты? На малых объёмах разницы почти нет. Но если задача — интеграция в CI/CD, автоматизация, кроссплатформенность, работа с удалёнными хранилищами — Python выигрывает по гибкости и расширяемости.

  • Bash/du/stat — быстрее на огромных каталогах, но сложнее парсить вывод, нет кроссплатформенности.
  • Python — чуть медленнее, но легко интегрируется с любыми сервисами, можно строить отчёты, отправлять алерты, работать с удалёнными файлами.

Интересный факт: на больших файловых системах (миллионы файлов) du работает быстрее, потому что использует C и оптимизированные системные вызовы. Но если нужен гибкий фильтр (например, считать только .log-файлы старше недели) — Python вне конкуренции.

Нестандартные способы использования

  • Мониторинг роста логов в реальном времени: скрипт следит за размером файла и отправляет алерт, если он растёт слишком быстро (например, подозрение на DDoS или баг в приложении).
  • Автоматическая очистка: если размер каталога превышает лимит — удалять самые старые файлы или архивировать их.
  • Интеграция с системами резервного копирования: перед бэкапом проверять, не превышает ли размер файла лимит (например, для облачных хранилищ).
  • Сбор статистики для биллинга: считать объём данных, который занимает каждый пользователь на сервере, и выставлять счёт по факту.

Какие новые возможности открываются?

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

  • Писать свои плагины для мониторинга (например, для Zabbix, Nagios, Prometheus).
  • Автоматизировать отчёты по использованию диска (например, отправлять отчёт в Slack или Telegram).
  • Строить графики роста логов, находить аномалии (например, резкий рост файла — сигнал о проблеме).
  • Интегрировать с системами биллинга, чтобы автоматически считать, кто сколько места занимает.
  • Писать свои утилиты для поиска “самых тяжёлых” файлов и каталогов.

Выводы и рекомендации

Получить размер файла в Python — задача простая, но с нюансами. Для большинства задач хватит os.path.getsize() или pathlib.Path().stat().st_size. Если нужно работать с каталогами — используйте os.walk(), но будьте готовы к тормозам на больших объёмах. Для автоматизации и интеграции с другими сервисами Python — идеальный выбор: легко расширять, удобно строить отчёты, можно работать с удалёнными файлами.

Рекомендации:

  • Для быстрых скриптов — используйте стандартную библиотеку.
  • Для больших каталогов — подумайте о кэшировании или использовании системных утилит через subprocess.
  • Для удалённых файлов — используйте специализированные библиотеки (paramiko, boto3).
  • Интегрируйте скрипты в cron, системы мониторинга, CI/CD — это сильно упростит жизнь.
  • Не забывайте про права доступа и симлинки — это частые источники багов.

Если вы ищете надёжный VPS для своих экспериментов с Python и автоматизацией — заказать VPS. Для задач посерьёзнее — выделенный сервер с быстрым диском и SSD.

Официальная документация:

Пусть ваши логи не переполняют диск, а автоматизация экономит время для действительно интересных задач!


В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.

Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.

Leave a reply

Your email address will not be published. Required fields are marked