一、数据清洗

def read_file(path, newfile, ret):
    """
    读取path文件夹里面的所有文件,并在path的父目录下新建newfile文件,利用正则表达式将匹配到的内容写入到newfile文件中
    :param path: 要读取的文件夹
    :param newfile: 要存放的文件名
    :param ret: 正则表达式,用于提取需要的数据
    :return: 利用正则表达式将文件写入完成后,返回newfile的绝对路径
    """
    files = os.listdir(path)
    current_dir = os.path.dirname(path)
    filepath = os.path.join(current_dir, newfile)
    if os.path.exists(filepath):
        os.remove(filepath)
    for file in files:
        file = path + '\\' + file
        try:
            with open(file, 'r', encoding='utf-8', errors='ignore') as f:
                with open(filepath, 'a', encoding='utf-8') as fb:
                    for line in f:
                        res = re.search(ret, line)
                        if res is not None:
                            fb.write(line)
        except LookupError:
            return '文件不存在或没有权限访问!请管理员检查!'
    return filepath

上述脚本获取path文件夹下所有文件名称保存到列表files中,之后拼接newfile的本地路径filepath,判断本地是否存在filepath,如果存在则删除,循环列表files,打开文件file,创建文件filepath,判断文件file中符合正则表达式的数据存放到filepath中。

二、提取数据,统计分析

import time
import re
import os


def read_file(path, newfile, ret):
    """
    读取path文件夹里面的所有文件,并在path的父目录下新建newfile文件,利用正则表达式将匹配到的内容写入到newfile文件中
    :param path: 要读取的文件夹
    :param newfile: 要存放的文件名
    :param ret: 正则表达式,用于提取需要的数据
    :return: 利用正则表达式将文件写入完成后,返回newfile的绝对路径
    """
    files = os.listdir(path)
    current_dir = os.path.dirname(path)
    filepath = current_dir + newfile
    if os.path.exists(filepath):
        os.remove(filepath)
    for file in files:
        file = path + '\\' + file
        try:
            with open(file, 'r', encoding='utf-8', errors='ignore') as f:
                with open(filepath, 'a', encoding='utf-8') as fb:
                    for line in f:
                        res = re.search(ret, line)
                        if res is not None:
                            fb.write(line)
        except LookupError:
            return '文件不存在或没有权限访问!请管理员检查!'
    return filepath


def read_log(path, newfile, ret, split):
    """
    调用函数read_file()读取path文件夹里面的所有文件,并在path的父目录下新建newfile文件,利用正则表达式将匹配到的内容写入到newfile文件中。
    读取newfile文件的内容,将需要的内容用正则分割(e.g.:接口号,接口调用时长),提取需要的内容
    :param path: 要读取的文件夹
    :param newfile: 要存放的文件名
    :param ret: 正则表达式,用于提取需要的数据
    :param split: 正在表达式,将提取到的数据进行分割
    :return: 统计分割后的数据的第一个值和第二个值
    """
    global interface_dict
    start = time.time()
    file = read_file(path, newfile, ret)
    end = time.time()
    print("函数read_file()运行耗时共:%.2f秒" % (end - start))
    if os.path.exists(file):
        n = 0
        avg = 0
        count = 0
        interface_sum = {}
        interface_dict = {}
        with open(file, 'r', encoding='utf-8') as f:
            for line in f:
                res = re.search(ret, line)
                if res is not None:
                    ctime = re.search(ret, line).group()
                    num = re.split(split, ctime)
                    interface_value = int(num[1])
                    if interface_value > 1000:
                        if num[0] not in interface_sum:
                            interface_sum[num[0]] = 0
                            interface_dict[num[0]] = 0
                        interface_sum[num[0]] += interface_value
                        interface_dict[num[0]] += 1
                        count += int(num[1])
                        n += 1
                        avg = count / n
        interface_list = sorted(interface_dict.items(), key=lambda x: x[1])
        for d in interface_list:
            if d[1] >= 1:
                interface_s = interface_sum[d[0]]
                interface_avg = interface_s / d[1]
                print('接口%s调用总次数为:%d次,接口总调用时长为:%dms,平均时长为:%.2fms' % (d[0], d[1], interface_s, interface_avg))
        end = time.time()
        print('函数read_log()运行耗时共:%.2f秒' % (end - start))
        return '调用接口总次数为:%d次,接口运行总时长为:%dms,平均时长为:%.2fms' % (n, count, avg)
    else:
        return '文件不存在或没有权限访问!请管理员检查!'


c = read_log(r'E:\common', 'common.log', '[GCPU][0-9]*\s+执行时间\s+[0-9]*', '\s+执行时间\s+')
print(c)