Python:如何创建一个更新其消息值的日志?

22 浏览
0 Comments

Python:如何创建一个更新其消息值的日志?

我想要做出几个陈述,让标准输出在陈述之间没有换行符。

具体来说,假设我有以下代码:

for item in range(1,100):
    print item

结果是:

1
2
3
4
.
.
.

如何使其显示为:

1 2 3 4 5 ...

更好的是,是否可能只打印最后一个数字,这样屏幕上只有一个数字?

0
0 Comments

问题的原因是在Python中使用print语句打印输出时,默认会在每次输出后自动换行。然而,有些场景下我们希望将输出的内容更新到同一行,而不是每次输出都换行。为了解决这个问题,可以使用print语句的一些特定参数或者一些技巧来实现。

在Python 2中,可以使用print item,来省略换行。而在Python 3中,可以使用print(item, end=" ")来实现相同的效果。

如果希望每个数字在同一位置显示,可以使用上面提到的方法,或者使用以下代码(Python 2.7):

to = 20
digits = len(str(to - 1))
delete = "\b" * (digits + 1)
for i in range(to):
    print "{0}{1:{2}}".format(delete, i, digits),

在Python 3中,实现这个效果会稍微复杂一些;需要在循环内部使用sys.stdout.flush()来刷新输出缓冲区,否则输出将会在循环结束后才显示:

import sys
to = 20
digits = len(str(to - 1))
delete = "\b" * (digits)
for i in range(to):
   print("{0}{1:{2}}".format(delete, i, digits), end="")
   sys.stdout.flush()

实际上,根据我的理解,上述解决方案在打印时每次都会输出相同数量的退格符。所以,如果to的值为20,那么在输出1到9这些数字时会多输出一个退格符。为了解决这个问题,可以在循环内部重新计算digits的值,或者基于前一个i的值来动态调整digits的值。

尽管以上解决方案在功能上是正确的,但对于一些开发者来说可能会感到比较复杂和难以理解。特别是当需要回顾自己之前编写的代码时,可能会感到困惑。因此,有些开发者可能更喜欢使用其他更简单和直观的方法来实现这个目标。

最后,还有一些开发者在讨论中提到了一些兼容性和平台差异的问题,比如在不同操作系统上的输出效果可能会不同,以及可能会遇到换行符等问题。这些问题需要根据具体情况进行调试和解决。

要在Python中创建一个在输出过程中更新消息值的日志,可以使用一些特定的语法或技巧来实现。然而,需要根据具体情况选择合适的方法,并注意可能遇到的兼容性和平台差异问题。

0
0 Comments

问题的出现原因是希望在每次打印输出时更新日志中的值。

解决方法是使用终端控制码,特别是使用U+000D回车符号来实现。在Python中,回车符号可以用'\r'表示。下面是一个基于提供的代码的完整示例:

from sys import stdout
from time import sleep
for i in range(1,20):
    stdout.write("\r%d" % i)
    stdout.flush()
    sleep(1)
stdout.write("\n") # 将光标移动到下一行

需要注意的一些事项:

- '\r'应该放在字符串的开头,这样在程序运行时,光标将始终在数字之后。这不仅仅是为了美观,还因为某些终端模拟器在反过来使用时会变得非常混乱。

- 如果不包含最后一行代码,程序终止后,命令行提示符将覆盖数字。

- 在某些系统上,需要使用stdout.flush(),否则将不会有任何输出。其他系统可能不需要,但也不会造成任何损害。

如果发现这个方法不起作用,首先要怀疑的是终端模拟器存在问题。可以使用vttest程序来进行测试。

可以将stdout.write替换为print语句,但我更喜欢不将print与文件对象的直接使用混合在一起。

flush()函数是什么意思?因为我不使用该函数也可以正常工作!

通常情况下,Python的文件对象会累积数据,以便一次性将其发送到操作系统。这通常适用于对磁盘上的文件进行访问,但会干扰这种类型的任务。flush()函数强制文件立即将其所拥有的数据发送到操作系统。我很惊讶你在没有添加这个函数的情况下也能正常工作,因为在我添加之前它对我来说是不起作用的。

我使用的是Win32操作系统和Python 2.6。你用的是什么操作系统?

我使用的是Linux和Python 2.6。这很可能是Windows的“控制台窗口”和Unix伪终端之间的差异。现在不用担心这个问题。

我使用这种方法,但是我的终端中的光标在每次打印输出时都会从开头跑到末尾。有没有办法停止这种行为?这很难看。

有一些控制码可以隐藏光标,但如果你要这样做,我强烈建议你使用ncurses来实现。

在我的Freebsd上使用Python 2.7,sys.stdout.flush()似乎是必需的。

当我在Linux(Ubuntu 14)上使用Python 3.4的print语句时,它不起作用。

对我来说,这是一个更有用的答案,因为它适用于两个Python版本,并且是我Linux Mint系统上唯一有效的方法。

请注意,在Python的REPL中,回车符号无法正常工作(至少对于我在Ubuntu上的情况而言)。您需要执行一个脚本,而不仅仅是运行REPL命令,才能使任何这些方法起作用。

是的,这是因为REPL会干扰终端本身,以提供命令历史记录和编辑功能。更高级的REPL甚至可以让你操纵这个过程;CPython的REPL不行,我不知道IPython是否可以。

0
0 Comments

Python中如何创建一个更新消息值的日志?

在Python中,如果我们想要创建一个日志,其中的消息值会不断更新,我们需要改变print语句的写法。具体的解决方法如下:

print item改为:

- 在Python 2.7中,使用print item,

- 在Python 3中,使用print(item, end=" ")

如果你想要动态地打印数据,可以使用以下语法:

- 在Python 3中,使用print(item, sep=' ', end='', flush=True)

http://docs.python.org/reference/simple_stmts.html#print中可以了解到:在print语句的末尾会自动添加一个'\n'字符,除非print语句以逗号结尾。如果语句中只包含关键字print,那么这是唯一的操作。

另外需要注意的是,print(item, end=" ")可以在Python 2.7中使用,只需在文件顶部添加from future import print_function

但是遗憾的是,flushfrom __future__ import print_function一起使用时无效。

0