Python课程作业四——maillog分析

本文最后更新于:几秒前

题目要求

分析附件中的邮件日志maillog,把id、状态、IP地址和目标邮箱提取出来。并统计出现错误最多的是那种邮箱。

点击下载:maillog.txt

代码与注释

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
"""
出现错误最多的邮箱有:
['online.sh.cn']
其出错次数为:
6
"""

import re
#正则表达式
pat_delivery = "delivery \d{0,}"
pat_id = "\d+"
pat_start = "starting"
pat_mail = "\w+@\S+\.(com|cn)"
pat_status = "(success|deferral|failure)"
pat_ip= "\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"
#记录空白信息
mail_error = "mail not found"
ip_error = "ip not found"
#暂存邮箱地址的dict
id_mail_dict = {}
#存储所有结果的list
info_list = []
#统计错误邮箱的dict
error_count = {}
#统计错误邮箱数最大的list
error_max_list = []
try:
maillog = open("maillog.txt","r")
for each in maillog:
#通过delivery的匹配判断是否是需要的语句
ret = re.search(pat_delivery,each)
if ret is not None:
#判断是否是请求发出的日志
isStart = re.search(pat_start,each)
id = re.search(pat_id, str(ret.group())).group()
#如果是请求发出日志,截取id和mail
if isStart is not None:
mail = re.search(pat_mail,each).group()
id_mail_dict[id] = mail
#否则,截取status和ip
else:
status = re.search(pat_status,each).group()
ip = re.search(pat_ip,each)
#try_catch用来判断存mail的环节中是否有当前的id,如果没有,记录"mail not found"
try:
#if-else判断ip是否读取成功,如果没有,记录"ip not found"
if ip is None:
ip = ip_error
else: ip = ip.group()
#存储一组信息到list中,格式:(id,mail,status,ip)
info_list.append((id,id_mail_dict[id],status,ip))
except:
info_list.append((id,mail_error,status,ip))
#将读取到的结果存储到文件中
try:
info_file = open("result.txt","w")
for each in info_list:
id,mail,status,ip = each[0],each[1],each[2],each[3]
str = "id:"+id+"\tmail:"+mail+"\tstatus:"+status+"\tip:"+ip
# print(each)
info_file.write(str+"\n")
#统计出现错误最多的邮箱,其中deferral与failure均作为错误处理
if status == "deferral" or status == "failure":
if mail != mail_error:
mail_kind = mail.split("@")[1]
if mail_kind not in error_count.keys():
error_count[mail_kind] = 1
else:
error_count[mail_kind] += 1
#因为错误数量最大的邮箱可能有多个,所以选择排序后判断的方法
#按值排序
sorted_count = sorted(error_count.items(),key= lambda x:x[1],reverse=True)
max_count = sorted_count[0][1]
print(sorted_count)
for each in sorted_count:
if each[1] == max_count:
error_max_list.append(each[0])
else: break
#输出最多错误的邮箱种类
print("出现错误最多的邮箱有:\n",error_max_list)
print("其出错次数为:\n",max_count)

except:
print("文件创建有误,请检查您的操作是否正确")
maillog.close()
except FileNotFoundError:
print("文件不存在,请检查您的日志文件是否有效")


结果文件

点击下载:result.txt


Python课程作业四——maillog分析
http://paopao0226.site/post/2d2ab2fb.html
作者
Ywj226
发布于
2022年11月5日
更新于
2023年9月23日
许可协议