私は私が次のように書くことができればいいのに
>>> print many_lines_message | tail -1
Pythonコンソールで、それを行う方法は?
print many_lines_message.splitlines()[-1]
head
、tail
および/またはコマンドをシミュレートしたい場合grep
は、スライスおよび/またはリスト内包表記を使用すると簡単です。
別のことをしたい場合は、もっと例を挙げてください。
本当に任意のPython式の出力を外部コマンドに渡したい場合は、プロセスを開始してパイプを使用する必要があります。bashではパイプのスペルト小麦ですが|
、Pythonではサブプロセスモジュールがそれを支援します。しかし、あなたが与えた例だけが必要な場合は、eumiroとJonClementsによる答えが必要です。
@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
もちろん、これはそれほど重要ではありません。0.5秒はほとんど感知できないため、どれだけの時間がかかったかはわかりません。要約すると、eumiroのソリューションがソリューションです。
ただし、大きなログなどの一部のファイルでは遅くなる可能性があるため、より高速なPythonソリューションが役立つ場合があります。
>>> %timeit message.rsplit('\n', 1)[-1]
10 loops, best of 3: 50.7 ms per loop
この場合、私はを使用します。これは、各文字の文字列を最後から最初まで1回だけrsplit()
分割します。'\n'
つまり、文字列を2つの文字列に分割します。1つは最後の行を除くすべてのメッセージを含み、もう1つは最後の行自体を含みます。次に、-1
インデックスの最後の行を取得します。
iterableの最後の要素を取得する1つの方法は、deque
:を使用することです。
from collections import deque
last_item = deque(your_message, maxsize=1)[0]