Bạn không nói liệu truy cập mỗi giờ là hàng ngày hay gì. Vì vậy, có rất nhiều cách mà điều này có thể xảy ra. Nhưng đây là một phiên bản đơn giản:
import collections
import io
log_data = '''
[01/Jan/2017:14:15:45 +1000]
[01/Jan/2017:14:15:45 +1000]
[01/Jan/2017:15:16:05 +1000]
[01/Jan/2017:16:16:05 +1000]
'''
def filter_lines(file):
for line in file:
if line.startswith('['):
yield line
def extract_hour_from_line(seq):
for line in seq:
yield line.split(':')[1]
def access_per_hour(file):
aph = collections.Counter(extract_hour_from_line(filter_lines(file)))
return aph
if __name__ == '__main__':
logfile = io.StringIO(log_data)
aph = access_per_hour(logfile)
print(aph)
Điều này sử dụng StringIO để chuyển đổi các dòng bạn cung cấp làm ví dụ thành tệp "trong bộ nhớ" có thể đọc được. Bạn chỉ có thể mở tệp nhật ký của mình, như bạn không nghi ngờ gì đã làm, để xử lý việc này bình thường.
Bộ sưu tập. Lớp thu nhận có chuỗi và tạo đối tượng giống từ điển trong đó các khóa là các mục từ chuỗi và giá trị là số đếm - số lần mỗi lần xuất hiện trong chuỗi.
Phiên bản mã này chỉ cần đếm tất cả các giá trị giờ khác biệt, không liên quan đến những gì ngày quyền truy cập xảy ra vào. Đó là, 12:00 vào thứ Ba và 12:00 ngày thứ tư được coi là cùng một giờ. Điều này rất hữu ích nếu bạn chỉ cần xây dựng một biểu đồ của nhu cầu từng giờ.
Nếu bạn muốn thực hiện nhóm nâng cao hơn, bạn có thể thử sử dụng hàm filter_lines
để giới hạn những dòng bạn muốn xem, tổng thể. Ví dụ: chỉ các dòng giữa một phạm vi ngày hoặc chỉ các dòng truy cập một URL cụ thể.
Nếu bạn muốn đối xử với các ngày khác nhau, bạn có thể sử dụng hàm extract_hour_from_line
để tạo một giá trị riêng biệt - ví dụ, nối ngày và giờ.
Nguồn
2017-08-22 14:57:28
Di chuyển từ Xem xét mã vì chỉ hiếm khi "hoạt động" và về cơ bản câu hỏi là yêu cầu viết lại mã. –