簡體   English   中英

為什么在打印時會增加額外的時間戳?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM