Python 仅显示一条记录行,删除以前的记录行

Python 仅显示一条记录行,删除以前的记录行,python,logging,formatter,Python,Logging,Formatter,我有一个使用日志记录模块和打印语句的程序。例如,日志记录是通知用户程序正在做什么 logging.info("downloading HTML") time.sleep(1) logging.info("parsing HTML") time.sleep(1) print "the result" 最后,屏幕上的输出(混合标准输出和标准输出)将为: 我想在显示下一个日志输出或调用打印时隐藏上一个日志输出。例如,启动程序,您将看到: INFO:download HTML 等待一秒钟,下一个信息

我有一个使用
日志记录
模块和
打印
语句的程序。例如,日志记录是通知用户程序正在做什么

logging.info("downloading HTML")
time.sleep(1)
logging.info("parsing HTML")
time.sleep(1)
print "the result"
最后,屏幕上的输出(混合标准输出和标准输出)将为:

我想在显示下一个日志输出或调用打印时隐藏上一个日志输出。例如,启动程序,您将看到:

INFO:download HTML
等待一秒钟,下一个信息
“解析HTML”
将替换上一个
“下载HTML”
,因此在屏幕上您将只看到:

INFO:parsing HTML
之前什么都不做,等一下,我只想在屏幕上看到:

"the result"
我只希望在登录到stderr时使用此功能,而不希望在登录到文件时使用此功能。例如,在那里,我希望看到所有
日志记录
输出


有可能吗?

在类似unix的终端上,您可以尝试在文本前加前缀

import time
import sys

print 'this is a text',
sys.stdout.flush()

time.sleep(1)
print '\x1b[80D'+'\x1b[K'+'Second text',
sys.stdout.flush()
字符“\x1b”是转义字符。第一个序列将光标向左最多移动80个位置。第二个清除了线

在print语句的末尾需要逗号,以防止它转到第二行。然后需要刷新
stdout
流,否则文本不会出现

编辑:要将其与日志记录相结合,请将其包装在一个简单的函数中:

def mylog(text):
    logging.info(text)
    print '\x1b[80D' + '\x1b[K'+ text,
    sys.stdout.flush()
编辑2:将其集成到标准日志中

import logging
# create console handler
ch = logging.StreamHandler()
# create formatter
formatter = logging.Formatter('\x1b[80D\x1b[1A\x1b[K%(message)s')
# add formatter to console handler
ch.setFormatter(formatter)
# add console handler to logger
logger.addHandler(ch)
由于日志记录模块似乎自己添加了换行符,因此我添加了一个ANSI序列(\x1b[1A)以增加一行


有关更多信息,请参见。

没有多大意义,因为这样的行为只能处理(如果有的话)通过控制台处理程序。由于日志调用被委托给已注册的处理程序列表,因此没有通用的方法来执行此操作。您想在此处滥用日志模块。不,写入标准输出是单向的,无法收回您所写入的内容。但是,您可以将终端设置为仅显示一行。@Dikei:您是对的,但您可以更改屏幕上打印的内容,例如使用
'\r'
@Maulwurfn:new handler?对不起,我不是专家,您可能想了解一下。我没有这方面的经验,但我在相关问题中听说过。谢谢,但重点是我想将其集成到
日志记录
模块中,是的,我能够做到这一点,关键是我想使用日志模块将其集成,假设我使用了高级功能,如格式化程序、自定义级别等。此外,函数的第一行是无用的,您可以删除它,您没有使用
日志记录
模块。最后,我不想更改代码,只定义一个ne您只需向流处理程序添加新的格式化程序。请参阅编辑2。
import logging
# create console handler
ch = logging.StreamHandler()
# create formatter
formatter = logging.Formatter('\x1b[80D\x1b[1A\x1b[K%(message)s')
# add formatter to console handler
ch.setFormatter(formatter)
# add console handler to logger
logger.addHandler(ch)