2012-07-17 41 views

回答

2

如果你真的想要一個任意Python表達式的輸出傳遞到外部命令,你將需要開始一個過程並使用管道。在bash中,一個管拼寫爲|,在Python中,subprocess模塊可以幫助你。但如果你只需要你給的例子,eumiro和Jon Clements的答案就是你需要的。

+0

這就是我需要的,非常感謝! – scythargon 2012-07-17 14:26:29

9
print many_lines_message.splitlines()[-1] 

如果要模擬headtail和/或grep命令,很容易與切片和/或列表內涵。

如果你想做一些不同的事情,給我們更多的例子。得到一個迭代的最後一個元素(一個或多個)

1

一種方法是使用一個deque

from collections import deque 
last_item = deque(your_message, maxsize=1)[0] 
+0

'deque'構造函數在我的機器(Python 2.7和Python 3.2)中不接受關鍵字'maxsize'。這是對的嗎? – brandizzi 2012-07-18 13:34:19

2

我擺弄@ eumiro的解決方案,因爲我認爲它可能太慢,尾巴可以更有效。實際上,速度要慢得多,但仍然不是很重要。雖然tail -1消耗此時:

$ seq 1 10000000 > f 
$ time tail -1 f 
10000000 

real 0m0.003s 
user 0m0.000s 
sys 0m0.000s 

的Python版本消耗高達200倍以上的時間:

>>> #message = "\n".join(str(i) for i in range(0, 10000000)) 
>>> %timeit message.splitlines()[-1] 
1 loops, best of 3: 679 ms per loop 

當然,這並不是說相關:你甚至不會看到多少時間它因爲半秒鐘幾乎感覺不到。總結起來,eumiro的解決方案是解決方案。

但是,它可以成爲一些文件,比如大的日誌太慢,所以更快的Python的解決方案可以幫助:

>>> %timeit message.rsplit('\n', 1)[-1] 
10 loops, best of 3: 50.7 ms per loop 

在這種情況下,我使用rsplit(),這將在分割字符串每個'\n' char從開始到結束都只有一次。也就是說,它會將字符串分成兩個字符串,一個包含除最後一行之外的所有消息,以及最後一行本身。然後,我得到-1索引的最後一行。

+0

這麼好的工作!:) – scythargon 2012-07-17 14:25:33

相關問題