Форум сайта python.su
К примеру есть текстовый файл следующего содержания:
'emails.txt'
These are latest emails from our partners:
From somebody@home.org Sat Jan 5 09:14:16 2015
From everybody@home.org Sun Feb 1 04:07:34 2015
From nobody@home.org Fri Mar 4 19:51:21 2015
From anybody@home.org Fri Apr 8 15:46:24 2015
From anybody@home.org Tue May 3 04:49:08 2015
From somebody@home.org Thu May 5 10:04:14 2015
From somebody@home.org Mon Jun 7 04:33:44 2015
From anybody@home.org Sun Jul 6 10:38:42 2015
From nobody@home.org Wed Aug 2 15:03:18 2015
From somebody@home.org Sat Aug 1 09:05:31 2015
А вот такой вывод я должна получить:
04 3
09 2
10 2
15 2
19 1
Т.е. необходимо отделить часы (slice) от метки времени, затем отсортировать кортежный список (sort) и вывести результат, который выше.
Здесь то, что смогла сделать:
name = raw_input("Enter file:") if len(name) < 1 : name = "emails.txt" handle = open(name) times = dict() for line in handle: line.strip() if not line.startswith("From ") : continue time = line.split() times[time[5]] = times.get(time[5],0) + 1 #print times.items() for k, v in times.items(): print k, v
Офлайн
from datetime import datetime from collections import Counter emails = open('emails', 'r').readlines() dates = [] for item in emails: if not item.startswith("From"): continue date = item.strip().split(' ', maxsplit=2) dates.append(datetime.strptime(date[-1], '%c').hour) for k, v in Counter(dates).most_common(): print("{} : {}".format(k, v))
Офлайн
@ ayb
получаю Traceback:… Type Error: split() takes no keyword arguments
и для новичка мне многовато начала вроде
from datetime import datetime
from collections import Counter
ещё не проходила (
Офлайн
Значит замените на :
date = item.strip().split(' ', 2)
Abeille
и для новичка мне многовато начала вроде
from datetime import datetime
from collections import Counter
line = lambda x: x.strip().split(' ', 5)[-1].split(':')[0] for k, v in Counter([line(x) for x in open('emails').readlines() if x.startswith("From")]).most_common(): print("{}: {}".format(k, v))
Отредактировано ayb (Авг. 5, 2015 18:21:58)
Офлайн
ayb
Можно записать даже вот так :
ayb…
line = lambda x: x.strip().split(' ', 5).split(':')
line = x.split()[5][:2]
line(x) for x in open('emails')
from collections import Counter hour=lambda x: x.split()[5][:2] with open('emails') as f: for v in Counter(hour(l) for l in f if l.startswith('From')).most_common(): print(*v)
Отредактировано Isem (Авг. 5, 2015 21:46:17)
Офлайн
@ayb
Спасибо.
Только я получаю не совсем тот результат:
3 04: 1
04: 1
2 15: 1
8 15: 1
и т.д.
А нужно это:
04 3
09 2
10 2
15 2
19 1
Мне нужны только часы и количество их повторов в файле и вывод именно в таком виде.
Отредактировано Abeille (Авг. 5, 2015 21:48:22)
Офлайн
@Isem
Итоговый код просто идеален!
Я ещё тупая, но всё исправила) (мне нужно было без двоеточия)
Огромное спасибо всем за помощь!
Отредактировано Abeille (Авг. 5, 2015 21:51:57)
Офлайн
Abeilleубрал
@Isemпоследний кусок почти идеалентолько как убрать двоеточия?
Офлайн
Isem
убрал
Отредактировано Abeille (Авг. 5, 2015 21:54:26)
Офлайн
на других подобных файлах не срабатывает
помучьтесь ещё по-простому, куда и что мне вписать, чтобы было так же красиво, как с предыдущим примером
обязательно (slice) и (sort)
снова тот же изначальный код без конкретного файла, но в котором точно такие же строки, как, например, вот эта From somebody@home.org Sat Jan 5 09:14:16 2015:
name = raw_input("Enter file:") if len(name) < 1 : name = "*.txt" handle = open(name) times = dict() for line in handle: line.strip() if not line.startswith("From ") : continue time = line.split() times[time[5]] = times.get(time[5],0) + 1 print times.items() for k, v in times.items(): print k, v
Отредактировано Abeille (Авг. 5, 2015 22:20:35)
Офлайн