溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

怎么在Python中利用sys.stdout.write實(shí)現(xiàn)一個(gè)打印刷新功能

發(fā)布時(shí)間:2021-04-16 17:40:58 來源:億速云 閱讀:163 作者:Leah 欄目:開發(fā)技術(shù)

怎么在Python中利用sys.stdout.write實(shí)現(xiàn)一個(gè)打印刷新功能?相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。

from datetime import datetime as dt
import sys
import time
 
for i in range(5):
  print(dt.now())
  time.sleep(1)

輸出結(jié)果:

C:\Users\Administrator\PycharmProjects\untitled\venv\Scripts\python.exe C:/Users/Administrator/PycharmProjects/untitled/test.py
2018-08-06 16:46:46.636256
2018-08-06 16:46:47.636313
2018-08-06 16:46:48.636370
2018-08-06 16:46:49.636427
2018-08-06 16:46:50.637484
 
Process finished with exit code 0

可以看到,用print打印出來自動(dòng)換行且不會(huì)清除上一個(gè)結(jié)果

help一下看看:

help(print)

輸出:

print(...)
  print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
  
  Prints the values to a stream, or to sys.stdout by default.
  Optional keyword arguments:
  file: a file-like object (stream); defaults to the current sys.stdout.
  sep:  string inserted between values, default a space.
  end:  string appended after the last value, default a newline.
  flush: whether to forcibly flush the stream.

可以看到end=“\n”表示了print自帶換行

如果我想要在一行中打印一串信息,并且在下一次執(zhí)行的時(shí)候刪除這一行再重新打?。ㄐЧ愃迫绱耍?,該如何做呢?嘗試清屏可不可以?

清屏試一試,查閱別的博客的方法有如下代碼:

import os
 
os.system('cls')

但這是在命令行里使用的,用在編譯器里不行。

解決辦法

這時(shí)候就要用到sys.stdout.write了

使用如下方法:

from datetime import datetime as dt
import sys
import time
 
 
while True:
  a = dt.now()
  sys.stdout.write("\r{0}".format(a))
  sys.stdout.flush()
  time.sleep(1)

以及:

from datetime import datetime as dt
import sys
import time
 
 
for i in range(20):
  a = dt.now()
  sys.stdout.write("\r{0}".format(a))
  sys.stdout.flush()
  sys.stdout.write('\033[4A')
  time.sleep(1)

都可以實(shí)現(xiàn)實(shí)時(shí)打印。

其關(guān)鍵就在于使用'\r'這個(gè)轉(zhuǎn)義字符(回到行首), sys.stdout.write首先打印這一行后不帶任何結(jié)尾(前文已經(jīng)說過print打印結(jié)尾帶end="\n",表示自帶換行,換行了就不能在對(duì)已經(jīng)打印的這一行進(jìn)行更改編輯),使用了轉(zhuǎn)移字符"\r"使得光標(biāo)回到行首,再把緩沖區(qū)顯示出來,就得到了我們所需要的效果。

效果輸出:

C:\Users\Administrator\PycharmProjects\untitled\venv\Scripts\python.exe C:/Users/Administrator/PycharmProjects/untitled/test.py
2018-08-06 18:26:21.264878

Run只會(huì)顯示這一個(gè),并且一秒鐘更新一次。

這樣就可以利用它來打印進(jìn)度條。

進(jìn)度條的特點(diǎn):

- 有標(biāo)刻度顯示所占總進(jìn)度比例

- 有百分比顯示所占比例

代碼示例:

import time,sys
 
for i in range(100):
  percent = i / 100
  sys.stdout.write("\r{0}{1}".format("|"*i , '%.2f%%' % (percent * 100)))
  sys.stdout.flush()
  time.sleep(1)

輸出效果:

|||||||||||||||||||||||||||||||||33.00%

拓展:Python小知識(shí)-sys.stdout.write和print進(jìn)度條打印方式

打印進(jìn)度條的方法用兩種:

一、sys.stdout.write方式

這個(gè)方法中必須使用這句話每次來清理緩存。

sys.stdout.flush()

import sys
import time

i = 0
for i in range(20):
  time.sleep(1)
  sys.stdout.write("\r# Process: %0.1f %%" % (float(i + 1) / float(20) * 100))
  sys.stdout.flush()

二、print方式

其中用print('',end='')來實(shí)現(xiàn)sys.stdout.write()

import time
i = 0
for i in range(20):
  time.sleep(1)
  print("\r# Process: %0.1f %%" % (float(i + 1) / float(20) * 100),end="")

結(jié)果如圖1所示:

怎么在Python中利用sys.stdout.write實(shí)現(xiàn)一個(gè)打印刷新功能

圖1

三、\r等轉(zhuǎn)義字符操作

轉(zhuǎn)義字符描述
\反斜杠符號(hào)
\r回車
\t橫向制表符
\n換行
\'單引號(hào)
\”雙引號(hào)
\oyy八進(jìn)制數(shù)yy代表的字符,例如:\o12代表換行
\xyy十進(jìn)制數(shù)yy代表的字符,例如:\x0a代表換行
\f換頁
\b退格(Backspace)

看完上述內(nèi)容,你們掌握怎么在Python中利用sys.stdout.write實(shí)現(xiàn)一個(gè)打印刷新功能的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI