12

操作系统:Windows 7

我的理解是 \r 将文本移动到页面的左侧。

但是,当我执行此操作时:

carriage_return = "I will use a carriage\rreturn"

print carriage_return

我得到了:返回使用马车

我所期待的是:返回

4

4 回答 4

22

好吧,看来您确实移到了该行的左侧。它只是让线路的其余部分保持不变。请注意,它return是 6 个字符,I will也是 6 个字符。

于 2013-09-09T06:34:26.220 回答
12

\r 将光标带到行首。当您将马车移动到开头并覆盖那里的任何内容时,这与物理打字机中的效果相同。

于 2013-09-09T06:35:11.600 回答
7

\r 转义序列之后的所有字符都向左移动,并准确覆盖语句开头出现的字符数。

在您的示例中,在 \r 之后有return并且它是 5 个字符,它替换了I will这也是 5 个字符(不要忘记包含空格:P)所以它基本上替换了I will并使用回车打印返回

于 2017-01-13T10:55:53.973 回答
5

只是为了补充这一点。如果你想回到开头并删除该行的内容,你可以这样做:

text = "Here's a piece of text I want to overwrite" 
repl = "BALEETED!" # What we want to write
print(text, end="\r") # Write the text and return
print(f'\r{repl: <{len(text)}}')

最后一行可能需要一些解释,所以我将其分解:

f'SOMETHING {var}'是一个 f 字符串,等价于'SOMETHING {}'.format('HERE'). 它在 Python 3.6+ 中可用

所以替换变量的硬编码值,我们回到开头,然后写替换字符串,后面有足够的空格来替换原始文本。如果您想使用在这种情况下可能更清楚的旧格式方法:

print('\r{0: <{1}}'.format(repl, len(text)))

# Which becomes when extrapolated:
print('BALEETED                                  ')

对于奖励积分,您不需要使用空格,您可以使用任何东西:

print('\r{0:░&lt;{1}}'.format(repl, len(text)))

# Which becomes when extrapolated:
print('DELETED░░░░░░░░░░░░░░░░░░░░░░░░░░░░░')

或者为了额外的 BONUS 把它变成一个函数:

from time import sleep
def overprint(text,repl, t=1, char=" "):
    print(text, end="\r")
    sleep(t) 
    print('\r{0:{1}<{2}}'.format(repl, char, len(text)))

overprint("The bomb will explode in one sec...", "BOOM!")
于 2018-12-10T19:26:34.867 回答