[英]Why does this add an extra timestamp when printing?
我使用下面的代码将时间戳添加到打印中。 但是奇怪的是为什么要在消息周围添加两个时间戳。
old_f = sys.stdout
class CFout:
def write(self, x):
old_f.write("%s %s " % (datetime.now().strftime("%d/%m/%Y %H:%M:%S:%f"), x))
sys.stdout = CFout()
当我print True
。 它输出如下。
15/05/2015 05:42:02:121945 True 15/05/2015 05:42:02:121977
在True
之前和之后,有两个时间戳。
为什么是这样? 我只想在True
之前添加时间戳。
这是由于print
语句或函数执行两次调用write
,一次打印消息( 'True'
),以及一次结束换行符或空格。
您可以使用如下脚本来查看此内容:
import sys
from datetime import datetime
args = []
class CFout:
def write(self, x):
args.append(x)
sys.__stdout__.write("%s %s " % (datetime.now().strftime("%d/%m/%Y %H:%M:%S:%f"), x))
sys.stdout = CFout()
print True
print False
print 1, 2, 3
sys.stdout = sys.__stdout__
print 'arguments were'
print args
调用结果:
$python2 prnt.py
15/05/2015 08:07:03:171182 True 15/05/2015 08:07:03:171392
15/05/2015 08:07:03:171452 False 15/05/2015 08:07:03:171477
15/05/2015 08:07:03:171517 1 15/05/2015 08:07:03:171540 15/05/2015 08:07:03:171561 2 15/05/2015 08:07:03:171581 15/05/2015 08:07:03:171601 3 15/05/2015 08:07:03:171621
arguments were
['True', '\n', 'False', '\n', '1', ' ', '2', ' ', '3', '\n']
注意:
'True'
和'\\n'
是在执行print True
时执行的两个调用的参数。 'False'
和'\\n'
是在执行print False
时执行的两个调用的参数 '1'
, ' '
, '2'
, ' '
, '3'
和'\\n'
是执行print 1,2,3
时执行的参数。 看到这种情况的另一种方法是使用异常:
>>> print 1, 1/0, 2
1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: integer division or modulo by zero
注: 1
还在印刷,即使1/0
引发异常。 python所做的是将每部分内容打印出来,对其进行评估,然后调用write
。 然后,它调用write(' ')
以打印逗号引起的空间,并最终求出1/0
,这将导致异常。
以相同的方式, print True
首先计算True
,然后调用write(str(True))
,最后调用write('\\n')
添加最后的换行符。
如果要在消息上正确附加时间戳,则应改用logging
模块。
基于@Bakuriu答案,我正在使用下面的代码来实现我的目标,因为我确信我不会在打印消息中使用“ \\ n”。 :)。 如果其他人也有兴趣,我会在这里发布。
old_f = sys.stdout
class CFout:
def write(self, x):
if x.find("\n") == -1:
old_f.write("%s %s " % (datetime.now().strftime("%d/%m/%Y %H:%M:%S:%f"), x))
else:
old_f.write(x)
sys.stdout = CFout()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.