1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        給Python代碼加上酷炫進度條的幾種姿勢

        共 3160字,需瀏覽 7分鐘

         ·

        2020-07-24 20:27

        點擊上方Python 知識大全』關(guān)注并星標

        第一時間接收最新Python干貨!

        032b45be489cf0a11eddfee482c56da4.webp

        大家好,在下載某些文件的時候你一定會不時盯著進度條,在寫代碼的時候使用進度條可以便捷的觀察任務處理情況,除了使用print來打印之外,今天本文就介紹幾種給你的Python代碼加上酷炫的進度條的方式。

        20730ab912fc170568a0c14802ddafa1.webp

        自定義ProgressBar

        最原始的辦法就是不借助任何第三方工具,自己寫一個進度條函數(shù),使用time模塊配合sys模塊即可

        import?sys
        import?time

        def?progressbar(it,?prefix="",?size=60,?file=sys.stdout):
        ????count?=?len(it)
        ????def?show(j):
        ????????x?=?int(size*j/count)
        ????????file.write("%s[%s%s]?%i/%i\r"?%?(prefix,?"#"*x,?"."*(size-x),?j,?count))
        ????????file.flush()????????
        ????show(0)
        ????for?i,?item?in?enumerate(it):
        ????????yield?item
        ????????show(i+1)
        ????file.write("\n")
        ????file.flush()

        ????
        for?i?in?progressbar(range(15),?"Computing:?",?40):
        ????do_something()
        ????time.sleep(0.1)

        dd27c81774c2d9f0e0ef9ef96f4e0124.webp

        自己定義的好處就是可以將進度條定義成我們想要的形式比如上面就是使用#·來輸出,為什么不用print?因為sys.stdout就是print的一種默認輸出格式,而sys.stdout.write()可以不換行打印,sys.stdout.flush()可以立即刷新輸出的內(nèi)容。當然也可以封裝成類來更好的使用[1]?,但效果是類似的。

        from?__future__?import?print_function
        import?sys
        import?re


        class?ProgressBar(object):
        ????DEFAULT?=?'Progress:?%(bar)s?%(percent)3d%%'
        ????FULL?=?'%(bar)s?%(current)d/%(total)d?(%(percent)3d%%)?%(remaining)d?to?go'

        ????def?__init__(self,?total,?width=40,?fmt=DEFAULT,?symbol='=',
        ?????????????????output=sys.stderr)
        :

        ????????assert?len(symbol)?==?1

        ????????self.total?=?total
        ????????self.width?=?width
        ????????self.symbol?=?symbol
        ????????self.output?=?output
        ????????self.fmt?=?re.sub(r'(?P%\(.+?\))d',
        ????????????r'\g%dd'?%?len(str(total)),?fmt)

        ????????self.current?=?0

        ????def?__call__(self):
        ????????percent?=?self.current?/?float(self.total)
        ????????size?=?int(self.width?*?percent)
        ????????remaining?=?self.total?-?self.current
        ????????bar?=?'['?+?self.symbol?*?size?+?'?'?*?(self.width?-?size)?+?']'

        ????????args?=?{
        ????????????'total':?self.total,
        ????????????'bar':?bar,
        ????????????'current':?self.current,
        ????????????'percent':?percent?*?100,
        ????????????'remaining':?remaining
        ????????}
        ????????print('\r'?+?self.fmt?%?args,?file=self.output,?end='')

        ????def?done(self):
        ????????self.current?=?self.total
        ????????self()
        ????????print('',?file=self.output)
        ????????
        from?time?import?sleep

        progress?=?ProgressBar(80,?fmt=ProgressBar.FULL)

        for?x?in?range(progress.total):
        ????progress.current?+=?1
        ????progress()
        ????sleep(0.1)
        progress.done()?

        7fd6b7e4c9690fa96c34f9196843b658.webp


        tqdm

        之前我們說了,自定義的好處就是可以自己修改,那么使用第三方庫的好處就是可以偷懶,不用自己寫,拿來就能用。比如提到Python進度條那肯定會想到常用的tqdm,安裝很簡單pip install tqdm即可,使用也很簡單,幾行代碼即可實現(xiàn)上面的進度條

        from?tqdm?import?trange
        import?time
        for?i?in?trange(10):?
        ????time.sleep(1)

        92afcbe06d44c14e286e3a185eb26b3b.webp

        當然tqdm作為老牌的Python進度條工具,循環(huán)處理、多進程、多線程、遞歸處理等都是支持的,你可以在官方GitHub上學習[2]?、解鎖更多的玩法。


        Rich

        上面兩種實現(xiàn)Python進度條的方法都學會了嗎,雖然簡單但是看上去并不漂亮,顏色也比較單調(diào)。所以最后壓軸出場的就是一款比較小眾的第三方庫Rich[3]?。Rich主要是用于在終端中打印豐富多彩的文本(最高支持1670萬色)

        a4b08389222b570d4d3dc3afdb360d28.webp

        所以當然可以使用Rich打印進度條,顯示完成百分比,剩余時間,數(shù)據(jù)傳輸速度等都可以。并且樣式更加酷炫,并且它是高度可配置的,因此我們可以對其進行自定義以顯示所需的任何信息。使用也很簡單,比如我們使用Rich來實現(xiàn)一個最簡單的進度條

        from?rich.progress?import?track
        import??time

        for?step?in?track(range(30)):
        ????print('早起Python')
        ????time.sleep(0.5)

        4002b885864c44b074a2123fb2b2513e.webp

        同時Rich支持多個進度條,這在多任務情況下監(jiān)控的進度很有用(使用方法見官方文檔)

        3d7001e16c0d7480c7f478d87272d524.webp



        6e56db3ac8286422a39bba1e86196aa9.webp

        參考資料

        [1]

        stackoverflow: https://stackoverflow.com/questions/3160699/python-progress-bar

        [2]

        Tqdm: https://github.com/tqdm/tqdm

        [3]

        Rich:?https://github.com/willmcgugan/rich

        ? 還想了解更多干貨?

        ?關(guān)注Python知識大全查看更多精彩文章


        覺得這篇文章還不錯?那就點亮「在看」讓更多人看到!


        推薦閱讀使用 Python 一鍵下載B站視頻
        Python 初學者進階的九大技能
        關(guān)注「Python 知識大全」,做全棧開發(fā)工程師歲月有你 惜惜相處
        回復【資料】獲取高質(zhì)量學習資料
        【在看】和【贊】我都需要
        瀏覽 52
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            人人操狠狠操 | 黄色国产免费 | 69色在线 | 张开腿让我尿在里面 | 日本三级全黄少妇三2020 | 亚洲丰满熟妇大荫蒂毛茸茸 | 日韩中文字幕第一页 | 黄色免费看 | 黄片成人网站 | 中国久久久 |