Как проверить размер файла и папки в Python?
Опубликовано: 2021-06-16В этой статье вы научитесь проверять размер файла или папки в Python.
Python - один из самых универсальных языков программирования. С его помощью вы сможете создавать из небольшой программы CLI (интерфейса командной строки) сложное веб-приложение.
Однако одной из наиболее недооцененных функций является возможность взаимодействия с оперативными системами. Управление операциями ОС с помощью Python может сэкономить массу времени при создании процессов автоматизации.
Посмотрим, как Python взаимодействует с ОС.
Как Python взаимодействует с ОС?

Никто не может жить изолированно от своего окружения. Это также применимо к Python, где иногда очень важно взаимодействовать с операционной системой для выполнения работы.
В Python есть несколько модулей, которые позволяют нам взаимодействовать с ОС. Наиболее часто используются os, sys, pathlib и subprocess.
Поскольку они являются встроенными модулями, вам не нужно устанавливать их с помощью PIP. Вы можете импортировать их все с помощью следующего оператора:
import os import sys import pathlib import subprocessВ приведенном ниже списке указаны основные функции каждого из этих импортов:
- Ос: Переносимый способ использования системных функций (в зависимости от вашей ОС). Это правильный выбор в большинстве случаев, если вам не нужно что-то более продвинутое.
- Sys: системные параметры и функции. Этот модуль обеспечивает доступ к переменным и функциям интерпретатора. Модуль os взаимодействует с операционной системой, а sys - с интерпретатором Python.
- Pathlib: расширенное использование пути. Позволяет представлять файловые системы как объекты с соответствующей семантикой для каждой ОС.
- Подпроцесс: выполнение и управление подпроцессами прямо из Python. Это включает в себя работу с кодами
stdin,stdoutи return. Вы можете узнать об этом больше, прочитав наше руководство по подпроцессам Python.
Существуют библиотеки высокого уровня, которые включают в себя даже более специфические функции в зависимости от ваших потребностей. Однако в большинстве случаев вы можете использовать вышеуказанные модули.
Примечание. Большинство функций, предоставляемых этими модулями, будут иметь разный вывод в зависимости от вашей ОС. Помните, что обычно лучше всего подходят UNIX и Python.
Теперь вы быстро понимаете, как Python взаимодействует с ОС, давайте перейдем к методам проверки размера файлов и папок. Все следующие решения доступны в размере файла и папки в репозитории Python GitHub.
Использование os.stat (). St_size
В этом методе мы собираемся использовать функцию stat () из модуля os. Он возвращает много информации о конкретном пути.
Примечание. Функция os.path.getsize () также выполняет свою работу. Преимущество использования os.stat (). st_size заключается в том, что он не следует симлинкам.
Прежде чем продолжить, давайте создадим тестовый файл с именем lorem.txt , в который мы собираемся вставить какой-нибудь тупой текст . Мы можем посетить текстовый генератор Lorem Ipsum и вставить текст в файл lorem.txt .
В том же каталоге создайте файл с именем method1.py и вставьте приведенный ниже код:
import os size = os.stat('lorem.txt').st_size print(size)Давайте разберемся, что мы делаем с этим кодом:
- В первой строке мы импортируем модуль os
- Переменная size содержит размер файла lorem.txt.
- Функция os.stat () возвращает кучу информации, относящейся к файлу.
- Атрибут st_size представляет размер файла
- Печатаем переменную размера
Попробуйте запустить скрипт Python. Вы получите разные результаты в зависимости от содержимого вашего файла lorem.txt .
Вывод:
20064Вывод представлен в байтах. Это вообще не читается, поэтому давайте сделаем его более человечным, чтобы лучше понять размер файла.
Сначала установите пакет humanize, выполнив следующую команду в своей оболочке:
pip install humanizeЗатем вы можете использовать функцию naturalsize (), которая преобразует значение в байтах в читаемый размер файла, например, КБ, МБ, ГБ или ТБ.
import os from humanize import naturalsize size = os.stat('lorem.txt').st_size print(size) print(naturalsize(size))Сначала приведенный выше код печатает размер файла в байтах, а затем выводит результат в удобочитаемом размере.
Вывод:
20064 20.1 kBИспользование Pathlib
Хотя pathlib предназначен для работы исключительно с путями, он включает в себя некоторые полезные функции из других модулей как методы объектов Path (экземпляры класса Path).
Создайте файл method2.py и импортируйте класс Path.
from pathlib import PathЗатем создайте объект Path, передавая путь к файлу lorem.txt в качестве аргумента.
file_ = Path('lorem.txt')Теперь вы можете получить доступ к методу stat () класса Path. Она работает так же, как функция os.stat () , поэтому вы сможете распечатать размер файла.
print(file_.stat().st_size)Вывод:
20064Как видите, мы получили тот же результат, что и при использовании первого метода. Результат выше также печатается в байтовом формате, поэтому мы можем использовать модуль humanize, чтобы сделать его читабельным.
from pathlib import Path from humanize import naturalsize size = Path('lorem.txt').stat().st_size print(naturalsize(size))Этот код дает следующий результат:

20.1 kBИспользование команд Unix с подпроцессом:
Модуль подпроцесса позволяет нам вызывать подпроцесс и управлять им из Python. Поэтому мы можем запускать любую команду и обрабатывать ее вывод непосредственно в Python.
Примечание. Этот метод работает только в том случае, если вы используете ОС Unix (Linux, Mac).
Откройте файл method3.py и вставьте приведенный ниже код:
from subprocess import run process = run(['du', 'lorem.txt'], capture_output=True, text=True) print(process.stdout)Погружаемся в этот фрагмент кода:
- Импортируем функцию запуска из модуля подпроцесса
- Переменный процесс содержит результат выполнения команды du lorem.txt
- du - это утилита Linux, которая позволяет нам получить дисковое пространство файла
- capture_output дает нам доступ к атрибуту standout (стандартный вывод)
- текст означает, что мы сохраняем вывод как строку вместо байтов
- Распечатываем стандартный вывод процесса
Если вы запустите приведенный выше код, вы получите следующий результат:
20 lorem.txtКак видите, он дает нам размер и имя файла. Если вы хотите получить только размер файла, вам нужно разделить вывод (помните, что это строка) и распечатать первый элемент.
from subprocess import run process = run(['du', 'lorem.txt'], capture_output=True, text=True) size = process.stdout.split()[0] print(size)Вывод:
20Этот вывод вообще не читается. Мы можем сделать вывод, что используемая единица измерения - КБ (из-за предыдущих методов), но никто другой не мог угадать размер файла.
Чтобы решить эту проблему, мы можем использовать флаг -h (удобочитаемый).
Примечание. Вы можете получить руководство по этой команде, запустив man du или du –help .
from subprocess import run process = run(['du', '-h', 'lorem.txt'], capture_output=True, text=True) size = process.stdout.split()[0] print(size)Теперь вывод этого скрипта будет более читабельным:
20KЕсли вы хотите узнать больше о модуле подпроцесса и возможных приложениях, ознакомьтесь с нашим руководством по подпроцессам Python.
Рекурсивное получение размера папки
Если вы хотите получить размер папки, вам нужно будет перебрать каждый файл, присутствующий в каталоге и его подкаталогах. Сделаем это двумя способами:
- Обход пути с помощью pathlib
- Использование команды du с подпроцессом
В следующем коде будет использоваться путь к тестовой директории внутри моей домашней папки. Вам нужно будет заменить путь к этому файлу на каталог, размер которого вы хотите получить.
Обход пути с помощью pathlib
Давайте посмотрим, как можно получить размер каталога, перебирая размеры файлов.
from pathlib import Path from humanize import naturalsize def get_size(path = '.'): size = 0 for file_ in Path(path).rglob('*'): size += file_.stat().st_size return naturalsize(size) test_path = Path.home() / 'Documents/tests/' print(get_size(test_path))Этот фрагмент кода кажется немного пугающим, давайте разберемся, что делает каждая его часть.
- Импортируйте класс Path и функцию naturalsize ()
- Определите функцию get_size () с путем к параметру, который по умолчанию указывает на текущий каталог.
- Переменная размера - это просто заполнитель, в который мы добавляем размер каждого файла.
- Перебирать каждый файл пути
- Метод rglob () рекурсивно возвращает файлы, соответствующие шаблону
- rglob ('*') означает, что мы получаем все файлы внутри каталога
- Получите размер каждого файла и добавьте его в переменную размера
- Возвращает переменную размера в удобочитаемом виде.
Конечно, я тестирую функцию с каталогом, доступным только на моей машине. Не забудьте изменить путь к папке, которая существует на вашем компьютере.
В моем случае я получаю следующий результат:
403.4 MBИспользование команды du с подпроцессом
Такой подход имеет ряд преимуществ:
- Результат немного точнее
- Это намного быстрее
from subprocess import run from pathlib import Path test_path = Path.home() / 'Documents/tests/' process = run(['du', '-sh', test_path], capture_output=True, text=True) size = process.stdout.split()[0] print(size)Мы используем тот же подход, что и метод 3, но на этот раз мы получаем размер каталога вместо файла.
Вывод:
481MКак видите, эти два способа получения размера папки возвращают немного разные результаты. Чем больше каталог, тем больше будет различий.
Вам решать, выбирать между подходами pathlib или subprocess . Если вы знаете, что будете использовать Linux каждый раз, когда используете подпроцесс , в противном случае вы можете использовать решение pathlib.
Подводить итоги
Результаты Python чрезвычайно удобны при взаимодействии с ОС. Вы можете автоматизировать процессы и сэкономить много времени с помощью Python. Основными модулями для взаимодействия с операционной системой являются os, sys, path и subprocess.
В этом уроке вы узнали:
- Как Python взаимодействует с ОС
- Использование встроенных модулей для работы ОС
- Как использовать модуль Humanize для печати в удобочитаемом формате
- Для расчета размера файла 3 подхода
- Чтобы вычислить размер каталога рекурсивно или с помощью команды du
