我希望我能像这样写
>>> print many_lines_message | tail -1
在python控制台中,该怎么做?
print many_lines_message.splitlines()[-1]
如果你想模拟head
和tail
/或grep
命令,使用切片和/或列表推导很容易。
如果您想做一些不同的事情,请给我们更多示例。
如果您真的想将任意 Python 表达式的输出传递给外部命令,则需要启动一个进程并使用管道。在 bash 中,管道是拼写|
的,在 Python 中,子进程模块可以帮助您。但是,如果您只需要给出的示例,那么 eumiro 和 Jon Clements 的答案就是您所需要的。
我在摆弄@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
索引的最后一行。
获取可迭代的最后一个元素的一种方法是使用deque
:
from collections import deque
last_item = deque(your_message, maxsize=1)[0]