各サーバーやプログラムのログを解析/集計する時に使用する関数の備蓄録です。
「Pythonでログを解析してみたい!」という方は是非参考にしてください!
1行を空白で区切る
splitを使用します。
splitの使用法は大きく分けて
-
str.split()
の様に区切り文字を指定せず、文字列strが空白区切りにされたリストを返してもらう -
str.split('区切り文字')
の様に区切り文字を指定し、文字列strを指定した区切り文字で区切ったリストを返してもらう
この2つの使用法があります。
前者のstr.split()
を使用します。
ログはタブや1文字分の空白で区切られていることが多いです。
ログの中で区切り文字が統一されていれば区切り文字を指定するのも良いのですが、残念ながら、タブと1文字分の空白の両方が混同されていることもあります。
str.split()
であればタブも1文字分の空白も同じ「空白」として区切ってくれるのです。
もちろん、カンマなどで区切られている時は、str.split('区切り文字')
を採用します。
カウントする
アクセス数を集計する際、
# カウントする関数
def count( targets):
cnt = {}
for target in targets:
if target in cnt.keys():
cnt[target] += 1
else:
cnt[target] = 1
return cnt
# このリスト内の文字列の出現回数を調べたい...
targets = ['aaa','bbb','ccc','aaa','bbb','aaa']
# カウントする関数を呼び出す
result = count( targets)
# カウント結果の閲覧
for key in result.keys():
print(key + ':' + result[key])
この様な関数を実装し、呼び出しても良いのですが、Python3系の標準パッケージに含まれているCollectionsの中にインスタンスを作成するだけでカウントしてくれるcollections.Counter
ククラスがあるので、それを使いましょう。
上に書いたcount.pyをcollections.Counter
クラスを使用して書き換えるとこうなります。
import collections
# このリスト内の文字列の出現回数を調べたい...
targets = ['aaa','bbb','ccc','aaa','bbb','aaa']
# カウントする関数を呼び出す
result = collections.Counter( targets)
# カウント結果の閲覧
for key in result.keys():
print(key + ':' + result[key])
カウント結果の閲覧方法はどちらも変わりません。
であれば、カウントするだけでなく他のこともできるcollections.Counter
クラスを利用する方がお得ですね!