我正在使用一个应用程序根据一分钟内完成的事情提供定时输出,我希望手动获取输出(复制粘贴)并拥有我的程序,我希望计算多少完成每一分钟的时间。
示例输出是:
13:48 An event happened.
13:48 Another event happened.
13:49 A new event happened.
13:49 A random event happened.
13:49 An event happened.
因此,程序需要了解在13:48发生了2件事,在13:49发生了3件事。我不确定如何存储信息,但我需要对它们进行平均,以确定它发生频率的平均值。抱歉这么复杂!
答案 0 :(得分:4)
您可以将时间用作字典的键并将其指向事件消息列表。该值的长度将为您提供事件的数量,同时仍然让您自己了解特定事件:
>>> from pprint import pprint
>>> from collections import defaultdict
>>> events = defaultdict(list)
>>> with open('log.txt') as f:
... for line in f:
... time, message = line.strip().split(None, 1)
... events[time].append(message)
...
>>> pprint(dict(events)) # pprint handles defaultdicts poorly
{'13:48': ['An event happened.', 'Another event happened.'],
'13:49': ['A new event happened.',
'A random event happened.',
'An event happened.']}
如果你想要更加花哨,你可以将时间解析为时间对象。
编辑:考虑Mike Graham的建议。
答案 1 :(得分:3)
如果你只想要计算每分钟发生多少事件,那么你真的不需要python,你可以从bash中做到:
cut -d ' ' -f1 filename | uniq -c
给出
2 13:48
3 13:49
答案 2 :(得分:1)
如果您不需要知道发生了什么,只知道发生了多少次:
$ python3.1 -c'from collections import Counter
import fileinput
c = Counter(line.split(None, 1)[0] for line in fileinput.input() if line.strip())
print(c)' events.txt
输出:
Counter({'13:49': 3, '13:48': 2})
答案 3 :(得分:1)
您还可以使用groupby
模块中的itertools
函数将时间作为分组键。
>>> import itertools
>>> from operator import itemgetter
>>> lines = (line.strip().split(None, 1) for line in open('log.txt'))
>>> for key, group in itertools.groupby(lines, key=itemgetter(0)):
... print '%s - %s' % (key, map(itemgetter(1), group))
...
13:48 - ['An event happened.', 'Another event happened.']
13:49 - ['A new event happened.', 'A random event happened.', 'An event happened.']
答案 4 :(得分:0)
awk '{_[$1]++}END{for(i in _) print i,_[i]}' filename