- Home »

Как получить размер файла в 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), используйте соответствующие библиотеки:
Статистика и сравнение с другими решениями
Почему не использовать 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.
Официальная документация:
Пусть ваши логи не переполняют диск, а автоматизация экономит время для действительно интересных задач!
В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.
Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.