为什么这会在打印时添加额外的时间戳?

时间:2015-05-15 05:55:19

标签: python

我使用下面的代码将时间戳添加到打印中。但奇怪的是为什么它会在消息周围添加两个时间戳。

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之前添加时间戳。

2 个答案:

答案 0 :(得分:3)

由于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模块。

答案 1 :(得分:0)

基于@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()