威胁监测可以导出excel表格
- 表头:威胁名称、事件分类、攻击源、受威胁主机、级别、攻击阶段、开始时间、结束时间
每个月要出一份报告,每个月的报告都有很多相似的地方,我决定用一份报告提取出内容,总结成模板,然后用python处理表格的数据,这样可以极大简化以后的工作
接下来只说主要内容,控制模块不展示,不涉及数据,如果有建议或疑问:
felzll@163.com
主要步骤
- 1、分析报告,以段落分开,总结出每一章可固定的内容,把数据部分用标识符标记出来,形成模板
- 2、读取excel数据,分析,有些地方需要描图
- 3、将分析后的数据,图片与模板结合,放入预处理区
- 4、将预处理区的数据编排写入doc文档
python-docx处理doc报告数据
- python-docx以前是不支持doc的,现在支持了
语言版本:python3.9.4
因为是边学边实践文章中的代码采用了两种不同形式的注释,一种是google式的,一种是python推荐的,我都尝试了
处理现有报告形成模板
将同一类别的段落合并
将每一个段落按顺序写入TXT文本
然后将数据部分用符号标记
pip install pyexcel
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23def get_excel_data(path,option):
"""
返回excel文件的行或列的内容
:param path: 文件路径加文件名
:param option: 传入row 或 column表示获取 行 或 列
:return: 返回所需的行 或 列 的 list
"""
sheet = pyexcel.get_sheet(file_name=path)
if option == "row":
len_data = sheet.number_of_rows()
elif option == "column":
len_data = sheet.number_of_columns()
else:
return None
data_list = []
for i in range(len_data):
if option == "row":
data = sheet.row[i]
elif option == "column":
data = sheet.column[i]
# print(data)
data_list.append(data)
return data_list按行读取,方便处理威胁事件
按列读取,方便统计总体信息
- 获取报表的开始日期和结束日期,拼接好写入文件
1
2
3
4
5
6
7
8
9
10
11def get_file_time(path, data_list):
"""
从列表中获取开始时间和结果时间
:param data_list: datatime类型列表
:return str 2021年07月22日至2021年07月29日
"""
start_time = data_list[6][1].strftime('%Y年%m月%d日')
end_time = data_list[7][-1].strftime('%Y年%m月%d日')
my_time = start_time + "至" + end_time + "\n"
with open(path,"w+",encoding="utf-8") as f:
f.write(my_time)
- 统计报表整体信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23def parse_excel_list(data_list):
"""
解析excel的列的数据
:param data_list: 读取到的原始excel列内容
:return: 返回一个[[(内容,次数)],] 从大到小排序
"""
total_list = []
for col_data in data_list:
del col_data[0] # 除去表头
col_data.sort()
len_list = len(col_data)-1
data_dict = {}
count_data = 0 # 统计次数
for i in range(len_list):
count_data += 1
if col_data[i] != col_data[i+1] or i==len_list-1:
if i==len_list-1:
count_data += 1
data_dict[col_data[i]] = count_data
count_data = 0
data_dict = sorted(data_dict.items(), key=lambda kv:kv[1], reverse=True) # items()后得到一个元组,kv:kv[1],按照元组的第二个元素排序
total_list.append(data_dict)
return total_list