Python 如何使用 \r 在同一行打印?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/17391437/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to use \r to print on same line?
提问by Santosh Kumar
I have made a downloader:
我做了一个下载器:
#!/usr/bin/env python
#-*- coding:utf-8 -*-
from __future__ import print_function, division, absolute_import, unicode_literals
import os
import argparse
try:
from urllib2 import urlopen
except ImportError:
from urllib.request import urlopen
# {{ Argument parser
parser = argparse.ArgumentParser(
prog='downloader',
description='a featureful downloader'
)
parser.add_argument(
'-o',
dest='outputfile'
)
parser.add_argument(
'-r',
dest='remotefile'
)
downloader = parser.parse_args()
# }}
# {{ default local filename
if downloader.outputfile:
default_output_file = downloader.outputfile
else:
default_output_file = os.path.split(downloader.remotefile)[-1]
# }}
u = urlopen(downloader.remotefile)
meta = u.info()
file_size = int(dict(meta.items())['Content-Length'])
print("Downloading: %s Bytes: %s" % (default_output_file, file_size))
with open(default_output_file, 'wb') as f:
file_size_dl = 0
block_sz = 8192
while True:
buffer = u.read(block_sz)
if not buffer:
break
file_size_dl += len(buffer)
f.write(buffer)
status = r"%10d [%3.2f%%]" % (file_size_dl, file_size_dl * 100. / file_size)
status = status + chr(8)*(len(status)+1)
print(status)
A sample run of this script would be:
此脚本的示例运行将是:
python3 downloader.py -o ubuntu.iso -r http://releases.ubuntu.com/13.04/ubuntu-13.04-desktop-i386.iso
And a sample output will be:
示例输出将是:
Downloading: ubuntu.iso Bytes: 832569344
8192 [0.00%]
16384 [0.00%]
24576 [0.00%]
32768 [0.00%]
40960 [0.00%]
49152 [0.01%]
57344 [0.01%]
65536 [0.01%]
73728 [0.01%]
81920 [0.01%]
90112 [0.01%]
98304 [0.01%]
106496 [0.01%]
114688 [0.01%]
122880 [0.01%]
131072 [0.02%]
139264 [0.02%]
147456 [0.02%]
155648 [0.02%]
163840 [0.02%]
Note that as the loop goes the output is printed on a separate lines. I know I can use \r
(carriage return)to do that. But I have confusion where and how to use that.
请注意,随着循环的进行,输出将打印在单独的行上。我知道我可以使用\r
(回车)来做到这一点。但是我很困惑在哪里以及如何使用它。
回答by inclement
Put the \r
at the beginning or end of your printed string, e.g. '\rthis string will start at the beginning of the line'
. or 'the next string will start at the beginning of the line\r'
. Conceptually, \r
moves the cursor to the beginning of the line and then keeps outputting characters as normal.
将 放在\r
打印字符串的开头或结尾,例如'\rthis string will start at the beginning of the line'
. 或'the next string will start at the beginning of the line\r'
。从概念上讲,\r
将光标移动到行首,然后照常输出字符。
You also need to tell print not to automatically put a newline character at the end of the string. In python3, you can use end=""
as in thisprevious stackoverflow answer.
您还需要告诉 print 不要在字符串的末尾自动放置换行符。在python3,你可以使用end=""
在此之前的计算器答案。
Alternatively, instead of using print you can do import sys
and sys.stdout.write('whatever')
, which sends only the exact characters to stdout without an implicit newline. You'll probably also want to use sys.stdout.flush()
, without which it will store characters in a buffer rather than printing them immediately.
或者,您可以执行import sys
and代替使用 print sys.stdout.write('whatever')
,它只将确切字符发送到标准输出,而没有隐式换行符。您可能还想使用sys.stdout.flush()
,否则它将在缓冲区中存储字符而不是立即打印它们。
回答by ali_m
You can use sys.stdout.write
:
您可以使用sys.stdout.write
:
import time
import sys
def timer(t=5):
t0 = time.time()
now = t0
while now-t0 < t:
now = time.time()
timestr = '\r%%%i\t' %(100*(now-t0)/t)
sys.stdout.write(timestr)
sys.stdout.flush()
time.sleep(0.1)
回答by Ayman
Add an , end="\r"
to you print function. Also make sure your printed data has enough space to overwrite the previous printed data or be of the same length since just moving to the same line would not automatically clear the previous contents.
, end="\r"
向您添加打印功能。还要确保您的打印数据有足够的空间来覆盖以前的打印数据或具有相同的长度,因为仅移动到同一行不会自动清除以前的内容。