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とJonClementsによる答えが必要です。

于 2012-07-17T11:57:06.900 に答える
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

もちろん、これはそれほど重要ではありません。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インデックスの最後の行を取得します。

于 2012-07-17T13:20:08.187 に答える
1

iterableの最後の要素を取得する1つの方法は、deque:を使用することです。

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