• 威胁监测可以导出excel表格

    • 表头:威胁名称、事件分类、攻击源、受威胁主机、级别、攻击阶段、开始时间、结束时间
  • 每个月要出一份报告,每个月的报告都有很多相似的地方,我决定用一份报告提取出内容,总结成模板,然后用python处理表格的数据,这样可以极大简化以后的工作

  • 接下来只说主要内容,控制模块不展示,不涉及数据,如果有建议或疑问:felzll@163.com

  • 主要步骤

    • 1、分析报告,以段落分开,总结出每一章可固定的内容,把数据部分用标识符标记出来,形成模板
    • 2、读取excel数据,分析,有些地方需要描图
    • 3、将分析后的数据,图片与模板结合,放入预处理区
    • 4、将预处理区的数据编排写入doc文档
  • python-docx处理doc报告数据

    • python-docx以前是不支持doc的,现在支持了
  • 语言版本:python3.9.4

  • 因为是边学边实践文章中的代码采用了两种不同形式的注释,一种是google式的,一种是python推荐的,我都尝试了

    处理现有报告形成模板

  • 将同一类别的段落合并

  • 将每一个段落按顺序写入TXT文本

  • 然后将数据部分用符号标记

    • 总体威胁数量为#005#。其中,#005#。

      分析报表数据

  • 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
    23
    def 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
    11
    def 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
    23
    def 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+1or 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