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

Опубликовано: 2021-06-16

В этой статье вы научитесь проверять размер файла или папки в Python.

Python - один из самых универсальных языков программирования. С его помощью вы сможете создавать из небольшой программы CLI (интерфейса командной строки) сложное веб-приложение.

Однако одной из наиболее недооцененных функций является возможность взаимодействия с оперативными системами. Управление операциями ОС с помощью Python может сэкономить массу времени при создании процессов автоматизации.

Посмотрим, как Python взаимодействует с ОС.

Как Python взаимодействует с ОС?

Python взаимодействует с Os с модулями os, sys, path и subprocess.

Никто не может жить изолированно от своего окружения. Это также применимо к 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