Индикатор выполнения не работает должным образом в Python

Я создал программу, которая загружает видео в формате mp4 по ссылке. Я добавил код ниже

chunk_size = 256
URL = 'https://gogodownload.net/download.php?url=aHR0cHM6LyAdrefsdsdfwerFrefdsfrersfdsrfer363435349URASDGHUSRFSJGYfdsffsderFStewthsfSFtrftesdfseWVpYnU0bmM3LmdvY2RuYW5pLmNvbS91c2VyMTM0Mi9lYzBiNzk3NmM1M2Q4YmY5MDU2YTYwNjdmMGY3ZTA3Ny9FUC4xLnYwLjM2MHAubXA0P3Rva2VuPW8wVnNiR3J6ZXNWaVA0UkljRXBvc2cmZXhwaXJlcz0xNjcxOTkzNzg4JmlkPTE5MzU1Nw=='
x = requests.head(URL)
y = requests.head(x.headers['Location'])

file_size = int(y.headers['content-length'])

response = requests.get(URL, stream=True)
with open('video.mp4', 'wb') as f:
    for chunk in response.iter_content(chunk_size=chunk_size):
        f.write(chunk)

Этот код работает правильно и загружает видео, но я хочу добавить индикатор выполнения в реальном времени. Я пытался использовать alive-progress (код добавлен ниже), но это не сработало должным образом.

def compute():
    response = requests.get(URL, stream=True)
    with open('video.mp4', 'wb') as f:
        for chunk in response.iter_content(chunk_size=chunk_size):
            f.write(chunk)
            yield 256

with alive_bar(file_size) as bar:
    for i in compute():
        bar()

Это ответ, который я получил, однако файл загружен правильно

Любая помощь?

Что такое alive_bar()?

John Gordon 25.12.2022 19:20

это библиотека, которая создает причудливый индикатор выполнения, я видел это в другом ответе на стеке

Mythical Phantom 25.12.2022 19:29

@MythicalPhantom Вы обновляете панель с помощью bar(), когда вы написали фрагмент (я полагаю, это 256 байт). Таким образом, общее количество вызовов bar() в 256 раз меньше общего размера файла. Попробуйте инициализировать панель с помощью with alive_bar(file_size // 256) as bar: или вызвать панель с помощью bar(256)

Andrej Kesely 25.12.2022 19:35
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
3
65
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Скорее всего, это происходит из-за того, что ваш терминал не поддерживает кодировку, которая печатается. Отредактируйте настройки вашего терминального приложения для поддержки кодировки UTF-8 или выше (предпочтительно UTF-16 или UTF-32).

Также попробуйте tqdm. Это более известная библиотека, поэтому вы знаете, что она была опробована и протестирована.

Ответ принят как подходящий

Это код, который вы должны попробовать. Я обновил ваше свойство chunk_size, чтобы оно соответствовало размеру файла, который я также преобразовал в КБ (килобайты). Он также правильно показывает значения вместе с процентами.

Что касается странных полей, появляющихся на вашем терминале, это потому, что ваш терминал не поддерживает кодировку, используемую библиотекой. Возможно, попробуйте отредактировать настройки терминала для поддержки «UTF-8» или выше.

file_size = int(int(y.headers['content-length']) / 1024)
chunk_size = 1024

def compute():
    response = requests.get(URL, stream=True)
    with open('video.mp4', 'wb') as f:
        for chunk in response.iter_content(chunk_size=chunk_size):
            f.write(chunk)
            yield 1024

with alive_bar(file_size) as bar:
    for i in compute():
        bar()

Другие вопросы по теме