Python: считать линии и различать их - PullRequest
1 голос
/ 24 марта 2010

Я использую приложение, которое выдает синхронизированный вывод, основанный на том, сколько раз что-то делается за минуту, и я хочу вручную взять вывод (копировать, вставить) и получить мою программу, и я хочу посчитать, сколько раз каждую минуту это делается.

Пример вывода такой:

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.

Итак, программе необходимо понимать, что 2 вещи произошли в 13:48, а 3 - в 13:49. Я не уверен, как информация будет храниться, но мне нужно усреднить их после, чтобы определить среднее, как часто это происходит. Извините, что так сложно!

Ответы [ 5 ]

4 голосов
/ 24 марта 2010

Вы можете просто использовать время в качестве ключа для словаря и указать его в списке сообщений о событиях. Длина этого значения даст вам количество событий, в то же время позволяя вам получить доступ к самим определенным событиям:

>>> 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.']}

Если вы хотите быть более необычным, вы можете разобрать время в объект времени.

Редактировать: Примите во внимание предложения Майка Грэма.

3 голосов
/ 25 марта 2010

Если вы просто хотите подсчитать, сколько событий происходит каждую минуту, тогда вам не нужен python, вы можете сделать это из bash:

 cut -d ' ' -f1 filename | uniq -c

дает

  2 13:48
  3 13:49
1 голос
/ 25 марта 2010

Вы также можете использовать функцию 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.']
1 голос
/ 24 марта 2010

Если вам не нужно знать, что происходит, а только сколько раз, тогда:

$ 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})
0 голосов
/ 25 марта 2010
awk '{_[$1]++}END{for(i in _) print i,_[i]}' filename
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...