Если вы когда-либо работали с длительными процессами в Python — будь то обработка данных, загрузка файлов или вычисления — вы наверняка сталкивались с желанием отслеживать их прогресс. Я долго ковырялся с этим вопросом, и (лично по мне) — библиотека tqdm решает эту задачу быстро и элегантно, позволяя создавать красивые и информативные индикаторы прогресса. Остальные библиотеки либо слишком сложные, либо — не зашли 🙂 Итак — поехали!
Для начала — установим библиотеку:
pip install tqdm
Давайте начнём с базового использования tqdm. Вот пример с циклом, где индикатор прогресса покажет, сколько итераций уже выполнено:
from tqdm import tqdm import time for i in tqdm(range(10)): time.sleep(0.5) # Имитация работы
Запустим код, и увидим вот такую красоту:
100%|██████████| 10/10 [00:05<00:00, 2.00it/s]
Прогресс-бар автоматически обновляется с каждой итерацией, показывая общее количество шагов, скорость выполнения и оставшееся время.
Если вы работаете в Jupyter Notebook — можно использовать модуль tqdm.notebook для лучшего отображения:
from tqdm.notebook import tqdm import time for i in tqdm(range(10)): time.sleep(0.5)
Прогресс-бар будет выглядеть аккуратно и интегрируется в интерфейс Jupyter.
Впрочем, лично мне больше нравится использовать tqdm для отслеживания прогресса загрузки файлов (я частенько занимаюсь парсингом тех или иных данных, в процессе которых нужно грузить файлы различного размера, а без наглядности сложно понять — идет загрузка файла, или соединение зависло). Вот пример с загрузкой файла:
from tqdm import tqdm # Импортируем tqdm для отображения прогресс-бара import requests # Импортируем requests для выполнения HTTP-запросов # URL-адрес файла, который нужно скачать url = "http://ipv4.download.thinkbroadband.com/50MB.zip" # Отправляем GET-запрос с указанием stream=True для потоковой загрузки response = requests.get(url, stream=True) # Получаем общий размер файла из заголовков ответа # Если заголовок 'content-length' отсутствует, возвращаем 0 total_size = int(response.headers.get('content-length', 0)) # Открываем файл для записи в бинарном режиме with open("file.zip", "wb") as f: # Загружаем файл порциями по 1024 байта for data in tqdm(response.iter_content(1024), total=total_size//1024, unit='KB'): f.write(data) # Записываем данные в файл
Естественно — можно не только легко и просто создавать прогресс-бар, но и настраивать его внешний вид, а так же поведение. Посмотрите на код ниже:
from tqdm import tqdm import time for i in tqdm(range(10), desc="Обработка", unit=" шагов", colour="green"): time.sleep(0.5)
где:
— desc: описание перед прогресс-баром
— unit: единицы измерения (например, KB, files, steps)
— colour: цвет прогресс-бара (работает в терминалах с поддержкой цветов)
Работаете с Pandas? У меня для вас прекрасная новость — tqdm легко интегрируется с библиотекой pandas. Для этого нужно активировать поддержку через метод tqdm.pandas():
import pandas as pd from tqdm import tqdm tqdm.pandas() df = pd.DataFrame({"a": range(5)}) df["b"] = df["a"].progress_apply(lambda x: x ** 2)
И что вообще прекрасно — tqdm поддерживает асинхронный код, что делает её полезной для работы с asyncio. Для примера демонстрации работы — возьмем код, который имитирует обработку данных:
from tqdm.asyncio import tqdm_asyncio # Импортируем tqdm для работы с асинхронным прогресс-баром import asyncio # Импортируем модуль asyncio для асинхронного программирования # Асинхронная функция, которая выполняет некоторую работу async def worker(n): await asyncio.sleep(1) # Симулируем задержку в 1 секунду return n ** 2 # Возвращаем квадрат числа n # Основная асинхронная функция async def main(): # Используем tqdm_asyncio.gather для выполнения списка задач с отображением прогресс-бара results = await tqdm_asyncio.gather(*(worker(i) for i in range(10))) print(results) # Печатаем результаты выполнения всех задач # Запускаем основную асинхронную функцию asyncio.run(main())
Кстати, вот некоторые полезные параметры:
— leave=False: Убирает прогресс-бар после завершения работы.
— dynamic_ncols=True: Автоматически подстраивает ширину прогресс-бара.
— disable=True: Отключает прогресс-бар (например, для продакшн-кода).
— smoothing=0: Уменьшает колебания скорости.
Подведу итоги использования библиотеки tqdm для создания прогресс-баров:
— Простота интеграции: добавление прогресс-бара в ваш код занимает буквально одну строку.
— кроссплатформенность: работает в терминалах, Jupyter Notebook и даже GUI-приложениях.
— Гибкость: поддержка кастомизации, асинхронности и работы с большими данными.
Надеюсь, данный пост помог разобраться с вопросом создания прогресс-баров в Python. Как всегда — в случае возникновения вопросов пишите в Телеграм, или на почту. И да — поддерживайте блог 😉
Support the Blog!
Running a blog takes a lot of effort, time, and passion. Your donations help improve the content, inspire new ideas, and keep the project going.
If you’ve enjoyed the blog’s materials, any support would mean the world to me. Thank you for being here! ❤️