Примечание. Следующая статья поможет вам: Как проверить размер файла и папки в Python?
В этой статье вы научитесь проверить размер файла или папки в Python
Python — один из самых универсальных языков программирования. С его помощью вы сможете превратить небольшую программу CLI (интерфейс командной строки) в сложное веб-приложение.
Однако одной из его наиболее недооцененных функций является возможность взаимодействия с операционными системами. Управление операциями ОС с помощью Python может сэкономить массу времени при создании процессов автоматизации.
Давайте посмотрим, как Python взаимодействует с ОС.
Как Python взаимодействует с ОС?
Никто не может жить изолированно от окружающей среды. Это также применимо к Python, где иногда необходимо взаимодействовать с операционной системой для достижения цели.
Python имеет несколько модулей, которые позволяют нам взаимодействовать с ОС. Наиболее часто используются os, sys, pathlib и subprocess.
Поскольку они являются встроенными модулями, вам не нужно устанавливать их с помощью PIP. Вы можете импортировать их все с помощью следующего оператора:
import os import sys import pathlib подпроцесс импорта
В приведенном ниже списке указаны основные функции каждого из этих импортов:
Существуют высокоуровневые библиотеки, которые включают в себя еще более конкретную функциональность в зависимости от ваших потребностей. Тем не менее, в большинстве случаев вы можете работать с вышеуказанными модулями.
Примечание: Большинство функций, предоставляемых этими модулями, будут иметь различный вывод в зависимости от вашей ОС. Помните, что обычно лучше всего подходят UNIX и Python.
Теперь вы получили представление о том, как Python взаимодействует с ОС, давайте перейдем к методам проверки размера файлов и папок. Все следующие решения доступны в размере файла и папки в репозитории Python GitHub.
Использование os.stat().st_size
В этом методе мы будем использовать функцию stat() из модуля os. Он возвращает много информации о конкретном пути.
Примечание: os.path.getsize() функция также выполняет свою работу. Преимущество использования ос.стат().st_size заключается в том, что он не следует симлинкам.
Прежде чем продолжить, давайте создадим тестовый файл с именем лорем.txt, в который мы собираемся вставить некоторые файлы . Мы можем посетить текстовый генератор Lorem Ipsum и вставить текст в лорем.txt файл.
В этом же каталоге создайте файл с именем метод1.py и вставьте код ниже:
размер импорта ОС = os.stat(‘lorem.txt’).st_size печать(размер)
Давайте разберем, что мы делаем с этим кодом:
Попробуйте запустить скрипт Python. Вы получите другой результат в зависимости от содержания вашего лорем.txt файл.
Выход:
20064
Вывод представлен в байтах. Это вообще нечитаемо, поэтому давайте очеловечим его, чтобы мы могли лучше видеть размер файла.
Сначала установите пакет humanize, выполнив в своей оболочке следующую команду:
pip установить гуманизировать
Затем вы можете использовать натуральный размер() функция, которая преобразует значение в байтах в читаемый размер файла, например, КБ, МБ, ГБ или ТБ.
import os from humanize import naturalsize size = os.stat(‘lorem.txt’).st_size print(size) print(naturalsize(size))
Сначала приведенный выше код выводит размер файла в байтах, а затем выводит результат в удобочитаемом размере.
Выход:
20064 20,1 КБ
Использование Pathlib
Хотя pathlib предназначен для работы исключительно с путями, он включает в себя некоторые полезные функции из других модулей в качестве методов объектов Path (экземпляров класса Path).
Создать файл метод2.py и импортируйте класс Path.
из пути импорта pathlib
Затем создайте объект Path, передавая путь к лорем.txt файл в качестве аргумента.
file_ = Путь(‘lorem.txt’)
Теперь вы можете получить доступ к статистика() метод класса Path. Он работает так же, как ос.стат() функция, поэтому вы сможете распечатать размер файла.
печать (file_.stat().st_size)
Выход:
20064
Как видите, мы получили тот же результат, что и с первым методом, который мы использовали. Приведенный выше результат также печатается в байтовом формате, поэтому мы можем использовать модуль гуманизации, чтобы сделать его читабельным.
from pathlib import Путь от humanize import naturalsize size = Path(‘lorem.txt’).stat().st_size print(naturalsize(size))
Этот код производит следующий вывод:
20,1 КБ
Использование команд Unix с подпроцессом:
Модуль подпроцесса позволяет нам вызывать подпроцесс и управлять им из Python. Поэтому мы можем запускать любую команду и обрабатывать ее вывод непосредственно в Python.
Примечание: Этот метод работает, только если вы используете ОС Unix (Linux, Mac).
Откройте файл метод3.py и вставьте код ниже:
из подпроцесса импорта запустить процесс = запустить([‘du’, ‘lorem.txt’]capture_output=True, text=True) print(process.stdout)
Погружаемся в этот кусок кода:
Если вы запустите приведенный выше код, вы получите следующий вывод:
20 лорем.txt
Как видите, он дает нам размер и имя файла. Если вы хотите получить только размер файла, вам нужно разделить вывод (помните, что это строка) и напечатать первый элемент.
из подпроцесса импорта запустить процесс = запустить([‘du’, ‘lorem.txt’]Capture_output=True, text=True) size = process.stdout.split()[0]
печать (размер)
Выход:
20
Этот вывод вообще не читается. Мы можем сделать вывод, что используемая единица измерения — КБ (из-за предыдущих методов), но никто другой не мог угадать размер файла.
Для решения этой проблемы мы можем использовать -час (удобочитаемый) флаг.
Примечание: Вы можете получить руководство по этой команде, запустив человек дюили же дю -помощь.
из подпроцесса импорта запустить процесс = запустить([‘du’, ‘-h’, ‘lorem.txt’]Capture_output=True, text=True) size = process.stdout.split()[0]
печать (размер)
Теперь вывод этого скрипта будет намного читабельнее:
20 тыс.
Если вы хотите узнать больше о модуле подпроцесса и возможных приложениях, ознакомьтесь с нашим руководством по подпроцессу Python.
Получить размер папки рекурсивно
Если вы хотите получить размер папки, вам нужно перебрать каждый файл, присутствующий в каталоге и его подкаталогах. Мы сделаем это двумя способами:
Следующий код будет использовать путь к тестовому каталогу внутри моей домашней папки. Вам нужно будет заменить путь к этому файлу на каталог, размер которого вы хотите получить.
Перебор пути с помощью 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() / ‘Документы/тесты/’ print(get_size(test_path))
Этот фрагмент кода кажется немного пугающим, давайте разберем, что делает каждая его часть.
rglob(‘*’)означает, что мы получаем все файлы внутри каталога
Конечно, я тестирую функцию с каталогом, доступным только на моей машине. Не забудьте изменить путь к папке, которая существует на вашем компьютере.
В моем случае я получаю следующий вывод:
403,4 МБ
Использование команды du с подпроцессом
Этот подход имеет некоторые преимущества:
из подпроцесса import run из 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]
печать (размер)
Мы используем тот же подход, что и в методе 3, но на этот раз мы получаем размер каталога, а не файла.
Выход:
481M
Как видите, эти два способа получения размера папки возвращают немного разные результаты. Чем больше каталог, тем больше разницы вы получите.
Вам решать выбирать между pathlib или подпроцесс подходит. Если вы знаете, что будете использовать Linux каждый раз, используйте подпроцессиначе вы можете использовать решение pathlib.
Подводить итоги
Результат Python чрезвычайно удобен при взаимодействии с ОС. Вы можете автоматизировать процессы и сэкономить много времени с помощью Python. Основными модулями для взаимодействия с os являются os, sys, path и subprocess.
В этом уроке вы узнали: