Как измерить размер файла в 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.
Цель: анализ дискового пространства, сбор статистики.
Расширенные примеры работы с размером файла
Обработка больших файлов (>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 удобнее при цепочке операций.