2

我希望我能像这样写

>>> print many_lines_message | tail -1

在python控制台中,该怎么做?

4

4 回答 4

9
print many_lines_message.splitlines()[-1]

如果你想模拟headtail/或grep命令,使用切片和/或列表推导很容易。

如果您想做一些不同的事情,请给我们更多示例。

于 2012-07-17T11:43:33.847 回答
2

如果您真的想将任意 Python 表达式的输出传递给外部命令,则需要启动一个进程并使用管道。在 bash 中,管道是拼写|的,在 Python 中,子进程模块可以帮助您。但是,如果您只需要给出的示例,那么 eumiro 和 Jon Clements 的答案就是您所需要的。

于 2012-07-17T11:57:06.900 回答
2

我在摆弄@eumiro 的解决方案,因为我认为它可能太慢了,而 tail 可以更有效。实际上,它要慢得多,但仍然不是很重要。虽然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'字符处的字符串从末尾到开头精确地拆分一次。也就是说,它将字符串拆分为两个字符串,一个包含除最后一行之外的所有消息,另一个包含最后一行本身。然后,我得到-1索引的最后一行。

于 2012-07-17T13:20:08.187 回答
1

获取可迭代的最后一个元素的一种方法是使用deque

from collections import deque
last_item = deque(your_message, maxsize=1)[0]
于 2012-07-17T11:53:33.397 回答