如何使用\ r在同一行上打印?

San*_*mar 5 python stdout carriage-return python-3.x

我做了一个下载器:

#!/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)
Run Code Online (Sandbox Code Playgroud)

此脚本的示例运行将是:

python3 downloader.py -o ubuntu.iso -r http://releases.ubuntu.com/13.04/ubuntu-13.04-desktop-i386.iso
Run Code Online (Sandbox Code Playgroud)

并且示例输出将是:

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%]
Run Code Online (Sandbox Code Playgroud)

请注意,随着循环的进行,输出将打印在单独的行上.我知道我可以用\r (回车)来做那件事.但我有困惑在哪里以及如何使用它.

inc*_*ent 16

放在\r打印字符串的开头或结尾,例如'\rthis string will start at the beginning of the line'.或'the next string will start at the beginning of the line\r'.从概念上讲,\r将光标移动到行的开头,然后保持正常输出字符.

您还需要告诉print不要在字符串的末尾自动添加换行符.在python3,你可以使用end=""之前的计算器答案.

或者,而不是使用打印,你可以做import syssys.stdout.write('whatever'),其中仅发送确切的字符到stdout没有一个隐含的换行.您可能也想使用sys.stdout.flush(),没有它,它会将字符存储在缓冲区中而不是立即打印它们.


Aym*_*man 5

, end="\r"向您添加打印功能。还要确保您打印的数据有足够的空间来覆盖先前的打印数据或具有相同的长度,因为仅移至同一行不会自动清除先前的内容。

  • 使用 'end' 的想法很可爱,但我更喜欢在打印我的值之前而不是之后打印 '\r'。这样,打印的任何其他内容(例如回溯)都不会覆盖上次打印的值。 (3认同)