【问题标题】:How to overwrite multiline print in Python?如何在 Python 中覆盖多行打印?
【发布时间】:2019-10-10 12:09:22
【问题描述】:

有一些代码显示了函数过程:

all_nums = 100
counter = 0

def status(num, counter):
    print(
        f'Current number {num}',
        f'Numbers done: {counter}, all nums: {all_nums}',
        f'{(num/all_nums):2.1%}',
        flush=False, end='\r'
    )


for x in range(all_nums):
    counter += 1
    status(x, counter)
    time.sleep(0.1)

它有效。但我想把这段文字分成一行。当我将\n 添加到任何地方时,一切都会中断。

Current number 1, all nums: 100 0.0%
Current number 2, all nums: 100 1.0%
Current number 3, all nums: 100 2.0%
Current number 4, all nums: 100 3.0%

如何在多行中覆盖控制台输出?

【问题讨论】:

  • @Carcigenicate 我写得很清楚:代码可以正常工作,直到您添加换行符,之后它开始像常规打印一样工作,即不更改行,而是打印一个新行。跨度>
  • 请清楚显示当前输出和预期输出,这样我们更容易理解您想要什么
  • @Energya 我该怎么做?此函数修改输出字符串。我应该录制视频来展示它的工作原理吗?
  • 我运行了您的代码,所有输出都驻留在同一行。我的环境是 Ubuntu 上的 bash。您的环境可能是问题的一部分吗?
  • @jhelphenstine 你用换行符运行它吗,例如这里:f'Current number {num}\n', ?

标签: python-3.x


【解决方案1】:

使用一些 ANSI 转义码来控制您的终端:(来自 https://stackoverflow.com/a/11474509/8733066) "\033[F" 使终端光标上移一行,*3是因为有3行

def status(num, counter):
    print("\033[F"*3)
    print(
        f'Current number {num}',
        f'Numbers done: {counter}, all nums: {all_nums}',
        f'{(num/all_nums):2.1%}',
        sep="\n"
    )

# call this before the for loop:
print("\n"*3, end="")

【讨论】:

  • 不适合我。每次输出都是新的,从一个新行开始。
  • @kshnkvn 你用什么终端?
  • cmd、powershell、ubuntu bash in wsl
【解决方案2】:
all_nums = 100
counter = 0

def status(num, counter):
    print(
        f'Current number {num}',
        f'Numbers done: {counter}, all nums: {all_nums}',
        f'{(num/all_nums):2.1%}',
        flush=False, end='\r'
    )
    print()


for x in range(all_nums):
    counter += 1
    status(x, counter)
    time.sleep(0.1)

【讨论】:

  • 我认为 kshnkvn 正在寻找他的输出保持在同一行,而不是表现出换行行为。
  • 无论如何这个打印都换行
  • @jhelphenstine 是的
  • 当我运行问题中提供的代码时,每次迭代都打印在同一行,覆盖上一次迭代的文本。
猜你喜欢
  • 2021-07-29
  • 1970-01-01
  • 2021-03-14
  • 2021-10-24
  • 2017-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多