2012-07-17 47 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

相关问题