如何存储浮点元组到文件并读取计算每列均值?问题解决与优化
优化存储方案与数据读取均值计算解决办法
一、更优存储方案推荐
1. CSV格式(通用兼容,推荐)
CSV是结构化文本格式,跨语言/工具都能解析,用pandas或csv模块读写都很便捷,完美适配后续的均值计算需求。
写入代码(两种方式选其一):
- 用pandas直接转DataFrame保存:
import pandas as pd # stats是收集好的(add_score, keep_score, del_score)元组列表 df = pd.DataFrame(stats, columns=["add_score", "keep_score", "del_score"]) df.to_csv("./resources/outputs/generate/stats.csv", index=False)
- 用标准库csv模块写入:
import csv with open("./resources/outputs/generate/stats.csv", "w", newline="") as f: writer = csv.writer(f) writer.writerow(["add_score", "keep_score", "del_score"]) # 写入表头 writer.writerows(stats) # 批量写入所有数据
读取并计算均值:
import pandas as pd df = pd.read_csv("./resources/outputs/generate/stats.csv") # 直接计算各列均值 add_mean = df["add_score"].mean() keep_mean = df["keep_score"].mean() del_mean = df["del_score"].mean() print(f"add_score均值: {add_mean:.4f}") print(f"keep_score均值: {keep_mean:.4f}") print(f"del_score均值: {del_mean:.4f}")
2. Pickle格式(Python专属,高效序列化)
如果只在Python环境中读写,Pickle是最优选择——直接序列化Python对象,读写速度快,无需额外解析。
写入代码:
import pickle with open("./resources/outputs/generate/stats.pkl", "wb") as f: pickle.dump(stats, f)
读取并计算均值:
import pickle import pandas as pd with open("./resources/outputs/generate/stats.pkl", "rb") as f: stats = pickle.load(f) df = pd.DataFrame(stats, columns=["add_score", "keep_score", "del_score"]) # 计算均值逻辑同CSV方案 add_mean = df["add_score"].mean() # ... 其余均值计算同理
3. Numpy NPY格式(数值型数据高效存储)
如果所有分数都是数值类型,用Numpy的NPY格式存储,内存占用小,计算均值时无需转DataFrame,直接用Numpy原生方法即可。
写入代码:
import numpy as np stats_np = np.array(stats) np.save("./resources/outputs/generate/stats.npy", stats_np)
读取并计算均值:
import numpy as np stats_np = np.load("./resources/outputs/generate/stats.npy") # axis=0表示按列计算均值 means = np.mean(stats_np, axis=0) print(f"add_score均值: {means[0]:.4f}") print(f"keep_score均值: {means[1]:.4f}") print(f"del_score均值: {means[2]:.4f}")
二、现有文本文件的兼容处理方案
如果无法重新生成文件,需要直接处理现有stats.txt,可以通过字符串解析将每行的元组格式转为数值列表,再转DataFrame计算均值:
import pandas as pd data = [] with open("./resources/outputs/generate/stats.txt", "r") as f: for line in f: line = line.strip() if not line: continue # 移除括号并分割数值字符串 num_strs = line.strip("()").split(",") # 转换为float类型 add = float(num_strs[0].strip()) keep = float(num_strs[1].strip()) delete = float(num_strs[2].strip()) data.append([add, keep, delete]) df = pd.DataFrame(data, columns=["add_score", "keep_score", "del_score"]) # 计算均值 add_mean = df["add_score"].mean() keep_mean = df["keep_score"].mean() del_mean = df["del_score"].mean()
内容的提问来源于stack exchange,提问作者resei09
相关产品推荐
相关产品推荐

