2016-06-15 98 views
0

在Python程序中,我使用下面的重定向stdoutPython的更新文件(標準輸出)的最後一行

sys.stdout = open("log_file.txt", "a",0) 

在一定條件下我想重寫文件的最後一行。

我已經試過如下:

if (status=='SAME'): 
    print '\r'+'Above status doesnot change and last checked @'+str(datetime.datetime.fromtimestamp(time.time())), 

這似乎當我使用tail命令查看文件的工作。

tail -f log_file.txt 

但是,當我看着文件的原始內容,它不覆蓋最後一行,但它是附加。

請建議我保持sys.stdout = open("log_file.txt", "a",0)原樣的其他方法。

我的代碼正在生產輸出爲:

0007505-160614083053377-oozie-oozi-W-> Started : 2016-06-14 16:15:32 
[email protected]        RUNNING job_1465907358342_1346 RUNNING - 
Above status doesnot change and last checked @2016-06-14 16:15:43.096288 
Above status doesnot change and last checked @2016-06-14 16:15:53.344065 
Above status doesnot change and last checked @2016-06-14 16:16:03.672789 
[email protected]          OK  -      OK   - 

我想這是

0007505-160614083053377-oozie-oozi-W-> Started : 2016-06-14 16:15:32 
[email protected]        RUNNING job_1465907358342_1346 RUNNING - 
Above status doesnot change and last checked @2016-06-14 16:16:03.672789 
[email protected]          OK  -      OK   - 
+0

如果你不想追加,不以「一」打開它。 –

+0

我想追加在一些情況下,但如果條件來了,我想覆蓋最後一行..在我的情況下,如果狀態不會改變我想用最後checcked時間戳覆蓋最後一行。如果它發生變化,我想追加新的狀態。 –

回答

1

而不實際運行測試的情況下,我想嘗試:

  • openappend模式
  • 讀取線的文件,標明讀取後,在每一行
  • 開始時的文件位置最後一行,使用seek移回該行的開頭
  • write新文本(確保它至少與原始文件一樣長)。
  • close文件

===================

from __future__ import print_function # for 2.7 
f = open('log.txt', mode='r+') # for preexisting file 
for i in range(10): 
    ref = f.tell() 
    print('%s line %s'%(i,ref), file=f) 
    if (i % 3)==0: 
     f.seek(ref) 
     print('%s oops %s'%(i,ref), file=f) 
ref = f.tell() 
print('ending at %3d'%100, file=f) 
f.seek(ref) 
print('ending at %3d'%f.tell(), file=f) 
f.close() 

生產:

2200:~/mypy$ cat log.txt 
0 oops 0 
1 line 9 
2 line 18 
3 oops 28 
4 line 38 
5 line 48 
6 oops 58 
7 line 68 
8 line 78 
9 oops 88 
ending at 98 

在2.7這表格也有效:

sys.stdout = f 
for i in range(10): 
    ref = f.tell()  # or ref = sys.stdout.tell() 
    print '%s line %s'%(i,ref) 
    if (i % 3)==0: 
     f.seek(ref) 
     print '%s oops %s'%(i,ref) 
+0

通過將stdout重定向到文件,在作業運行時創建該文件。那麼,當我遇到這種情況時,你是在暗示我,停止將stdout重定向到文件,讀取文件,回到上一個位置並寫入它,關閉它並再次將輸出重定向到文件。 –

+0

我只是做了一些實驗。如果我用'r +'模式打開文件,我可以'readline','tell','seek'和'write'(或'print(...,file = f)')。由於我在交互式shell中,我沒有嘗試'stdout'重定向。但是我可以在不關閉的情況下使用單獨的打開/讀取(使用'ipython''%cat')來測試寫入。 – hpaulj

-1

我想你會的唯一途徑能夠做到這一點是如果你讀了整個文件並將每行(除最後一行)都打印回日誌。效率不是非常高,但它應該有效。

0

可以使用單獨的類是這樣的:

class OverwiteLogger(object): 
    def __init__(self): 
     self.filename = "filename.txt" 

    def write(self, message): 
     f = open(self.filename, "r") 
     lines = f.readlines() 
     lines[-1] = message 
     open(self.filename, 'w').writelines(lines) 
     f.close() 

而且使用它像:

logger = OverwriteLogger() 
sys.stdout = open('filename.txt', 'a', 0) 
if (status=='SAME'): 
    logger.write('Above status doesnot change and last checked @'+str(datetime.datetime.fromtimestamp(time.time()))) 
else: 
    print status 
相關問題