1.要求
程序 运行时,在控制台里 输入 report 里收集的 log文件,如 1_student_0.txt
。程序会把文件里的第3列数据 display quality
提取出来,并计算对应的平均值.
计算平均值前,要统计并比较这些文件的长度,以最短文件的长度为基准,进行截断处理。这样保证了文件里的 item num 一致。
note:支持输入多个文件同时处理
系统运行时log里记录的文件
各个文件里数据内容
2.实现
import os
import matplotlib.pyplot as plt
"""
@brief: 运行时,在控制台里 输入 report 里收集的 log文件,如 xx.txt。程序会把文件里的第3列数据 display quality 提取出来,并计算对应的平均值.
计算平均值前,要统计并比较这些文件的长度,以最短文件的长度为基准,进行截断处理。这样保证了文件里的item num 一致。
@note:支持输入多个文件同时处理
"""
# 获取当前脚本所在的目录路径
current_directory = os.path.dirname(os.path.abspath(__file__))
# 切换到当前目录
os.chdir(current_directory)
def read_cal_count(filename):
quality = []
with open(filename, 'r') as file_data:
for row in file_data:
tmp_list = row.strip("\n").split(',') # 去除首尾换行符,按‘,'切分每行的数据
quality.append(tmp_list[2]) # display quality
# 使用列表推导式筛选大于等于0的数值,保存到新列表
filtered_list = []
filtered_list = [int(num) for num in quality if int(num) > 0]
print(sum(filtered_list),len(filtered_list))
return filtered_list
def main():
filelist = input("请输入txt文件的完整路径,用逗号分隔:").split(',')
result = []
min_len = float('inf') # inf是正无穷大的表示
for file in filelist:
file = file.strip() #用于删除字符串两端的所有空白字符(包括空格、换行符、制表符等)。
try:
list_temp = read_cal_count(file)
length = len(list_temp)
result.append((file, list_temp,length))
if length < min_len:
min_len = length
except Exception as e:
print(f"读取{file}时出错: {e}")
print(f"最小长度是:{min_len}")
# 按照行数从小到大排序
result.sort(key=lambda x: x[2])
# 对每个list_temp进行切片,只保留最小长度的部分
for file, list_temp, length in result:
list_temp = list_temp[:min_len]
mean = sum(list_temp) / len(list_temp)
print(f"{file} 的quality平均值为:{mean:.2f},和是:{sum(list_temp)},长度是:{len(list_temp)}")
if __name__ == "__main__":
main()