繁体   English   中英

如何编辑已打印的内容?

[英]How can I edit what has already been printed?

例如,假设其中一个打印的内容是“Hello World”,第二个是“Hello”。 我如何将“Hello”打印在与“Hello World”相同的行上? 这只是一个例子。 实际上,我不知道打印的文本会有多长时间。

这是一个示例脚本:

x = open("file.txt", "r+").read().split("\n")
for i in x:
  print(something)

哪里的东西=我不知道。 我希望 output 成为文本文件的第一行所说的内容,然后是第二行所说的内容,依此类推,除了在第一行上打印第二/第三/第四...行并且每行都是未知长度,有些比其他的短。 可以说 file.txt 说:

Overflow
Stack

我希望它打印“溢出”然后“堆栈”,除了每个单词都打印在第一行,一旦你打印“堆栈”,就看不到“溢出”的每个部分

请记住print("Hello World", end="\r")由于长度原因,它不起作用。

您可以通过根据前一行用空格填充每一行来解决\r解决方案:

prev_size = 0
with open("file.txt", "r+") as f:
    for line in f:
        print(f"{line.strip()}{' '*prev_size}", end='\r')
        prev_size = len(line)

您可能希望在打印之间添加一个sleep ,以便能够真正看到文本的变化......

When you use the print function in python, you're just pushing characters onto a pipe somewhere (the pipe might be connected to the standard out, but your program doesn't know that). 一旦它被推动,您就无法取消推动它。 毕竟,pipe 甚至可能没有连接到屏幕。 它可能直接连接到另一个程序的输入,或者它可能使用物理打印机进行显示。 在这些情况下,un-push 甚至意味着什么?

但是,您可以将特殊控制字符(例如“退格”字符)推送到 pipe 以表示您要擦除字符。 但是,您连接的终端可以随意使用这些字符。 它可以尊重您的意愿并删除字符,也可以打印文字 '\b' 字符以指示退格,也可以完全忽略您并在前面的字母之后继续打印。 这完全不在你的控制范围内。

假设打印字符的终端支持覆盖字符,您可以使用 ANSI 控制序列。 将 cursor 移动到行首的顺序是'\033[1G'并且擦除从当前 cursor position0' 到行尾的所有内容是'\033[0K' 所以,

import time

print('hello world', end='', flush=True) # prints "hello world" with no newline at the end
time.sleep(2) # wait 2 seconds
print('\033[1G\033[0K', end='') # moves cursor to beginning of line and erases the line
print('hi') # prints "hi" with newline at the end

flush=True是必需的,因为 print function 默认情况下是缓冲的,并且在遇到换行符之前实际上不会打印任何内容。 这告诉 function 您想立即刷新缓冲区。

看看ANSI 转义代码,“CSI 序列”部分,看看还有哪些其他代码可用。

尝试这个

print("Hello World","Hello",end=" ")

end=" " 允许您在 print() 执行后留在同一行,因此每当您再次调用 print() function 时,值将从同一行开始打印

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM