キーワードはkey
呼び出し可能でなければなりません。入力シーケンスのすべてのエントリに対して呼び出されます。
Alambda
は、そのような呼び出し可能オブジェクトを作成する簡単な方法です。
sorted(..., key=lambda line: stringsplit(line))
ただし、多くの大きなファイルでの出力をソートすることには非常に注意が必要です。それらをソートできるようにするには、すべての行をメモリに読み込む必要があります。ファイルが多いか大きい場合、すべてのメモリを使い果たし、最終的に例外が発生します。fileinput
sorted()
MemoryError
別の方法を使用して、最初にログを事前に並べ替えます。UNIXツールsort
を使用するか、代わりに外部の並べ替え手法を使用できます。
入力ファイルがすでにソートされている場合は、同じキーを使用してそれらをマージできます。
import operator
def mergeiter(*iterables, **kwargs):
"""Given a set of sorted iterables, yield the next value in merged order"""
iterables = [iter(it) for it in iterables]
iterables = {i: [next(it), i, it] for i, it in enumerate(iterables)}
if 'key' not in kwargs:
key = operator.itemgetter(0)
else:
key = lambda item, key=kwargs['key']: key(item[0])
while True:
value, i, it = min(iterables.values(), key=key)
yield value
try:
iterables[i][0] = next(it)
except StopIteration:
del iterables[i]
if not iterables:
raise
次に、開いているファイルオブジェクトを渡します。
files = [open(f) for f in glob.glob('logs/*')]
for line in mergeiter(*files, key=lambda line: stringsplit(line)):
# lines are looped over in merged order.
ただし、関数が入力ログファイルで順序付けられた値を返すことを確認する必要があります。stringsplit()