Contents

探索 Console 進度條的實現方式

我常常看到指令執行時可以做出進度條效果。雖然裝了 Python 的其他套件就可以做出來,但我這邊找到了一種原生 Console 的做法。我覺得這很有趣,所以特別記錄下來。

相關文章

1
2
3
4
5
6
7
8
import time
import sys

for i in range(51):
    sys.stdout.write('\r')
    sys.stdout.write("[%-50s] %d%%" % ('='*i, 2*i))
    sys.stdout.flush()
    time.sleep(0.25)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
def printProgress(iteration, total, prefix='', suffix='', decimals=1, barLength=100):
    """
    Call in a loop to create a terminal progress bar
    @params:
        iteration   - Required  : current iteration (Int)
        total       - Required  : total iterations (Int)
        prefix      - Optional  : prefix string (Str)
        suffix      - Optional  : suffix string (Str)
        decimals    - Optional  : positive number of decimals in percent complete (Int)
        barLength   - Optional  : character length of bar (Int)
    """
    import sys
    formatStr = "{0:." + str(decimals) + "f}"
    percent = formatStr.format(100 * (iteration / float(total)))
    filledLength = int(round(barLength * iteration / float(total)))
    bar = '#' * filledLength + '-' * (barLength - filledLength)
    sys.stdout.write('\r%s |%s| %s%s %s' % (prefix, bar, percent, '%', suffix)),
    if iteration == total:
        sys.stdout.write('\n')
    sys.stdout.flush()

使用案例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
from time import sleep

# Make a list
items = list(range(0, 100))
i = 0
l = len(items)

# Initial call to print 0% progress
printProgress(i, l, prefix='Progress:', suffix='Complete', barLength=50)
for item in items:
    # Do stuff...
    sleep(0.1)
    # Update Progress Bar
    i += 1
    printProgress(i, l, prefix='Progress:', suffix='Complete', barLength=50

输出效果:

1
Progress: |#############################################-----| 90.0% Complete

原生 Console 處理(簡單實現)

在這篇文章 Python实现实时显示进度条的六种方法_python_脚本之家 中,我發現了一種使用單純的 print \r 就能實現進度條的方法。這讓我想到,我可以嘗試使用 Bash 來實現這個功能。我參考了 Stack Overflow 上的這個問題 bash - How to show and update echo on same line 來學習如何在同一行上更新文本。

以下是我參考腳本:

1
2
3
4
5
6
#!/bin/bash
# 使用 echo -ne 來輸出字符串並控制換行
# 使用 \\r 來將輸入位置移動到行首,這樣可以在同一行上更新文本
echo -ne "Movie   ADDED!"\\r && echo -ne "Movie   ADDED!2222"\\r
# Output
# Movie  -  AfDDEDfff

重點是\r,它可以將輸入位置移動到行首,使得進度條能在同一行更新。因此,每個程式語言只要能夠輸出這個符號,就可以實現這種進度條的效果。
我在 Stack Overflow 上找到了一個相關的問題 bash - How to add a progress bar to a shell script? - Stack Overflow,以下是問題中的一個解答:

1
2
3
4
5
6
7
8
# 使用 echo -ne 來輸出字符串並控制換行
# 使用 \\r 來將輸入位置移動到行首,這樣可以在同一行上更新文本
echo -ne '#####                     (33%)\r'
sleep 1
echo -ne '#############             (66%)\r'
sleep 1
echo -ne '#######################   (100%)\r'
echo -ne '\n'

番外 pv 指令

在這篇 Stack Overflow 的問答 bash - How to add a progress bar to a shell script? - Stack Overflow 中,我發現了 pv 指令,這是一個可以監視管道命令的進度的工具,我覺得這個功能非常神奇。這個問答中還提到了許多 pv 的實用方式。

然而,實務上 pv 指令需要搭配 pipeline 檔案來使用,這可能會限制它的實用性。不過,我會考慮在使用 dd 指令時嘗試使用 pv,儘管我最近很少需要進行這種操作。

Bing AI 查詢內容

您好,這是 Bing。我可以幫您什麼?😊

根據網路搜尋結果,Python console 進度條有哪些好用套件,有以下幾個選項:

  • tqdm:一個快速、可擴展的 Python 和 CLI 進度條庫,可以輕鬆地將任何可迭代的物件包裝成一個智能的進度條¹²。
  • alive-progress:一個新穎的進度條庫,可以顯示吞吐量和預計完成時間,甚至可以暫停,並有很酷的動畫效果¹。
  • progressbar2:一個簡單而靈活的進度條庫,可以自定義進度條的外觀和行為³。

您可以根據您的需求和喜好選擇其中一個套件來使用。希望這對您有幫助。👍

來源: 與 Bing 的交談, 2023/6/5(1) Python Progress Bar - Stack Overflow. https://stackoverflow.com/questions/3160699/python-progress-bar 已存取 2023/6/5.
(2) GitHub - tqdm/tqdm: A Fast, Extensible Progress Bar for Python and CLI. https://github.com/tqdm/tqdm 已存取 2023/6/5.
(3) Python Progress Bars: TQDM, Alive-Progress, and Progressbar2. https://datagy.io/python-progress-bars/ 已存取 2023/6/5.

彩蛋