Python读取.dat文件提取数值:优化方法及均值计算
优化方案:高效读取并处理.dat文件数据
原代码的问题点
- 循环内重复将列表转为numpy数组,完全没必要,会拖慢效率
- 变量命名冗余混乱(比如
s1、s_1、r1这类重复变量) - 均值计算公式有误:原代码
avgg=r1_f+r2_f/2是s1数值 + s2数值/2,不符合“两列取平均再算整体均值”的需求,正确逻辑应该是(r1_f + r2_f)/2 - 冗余导入了
os.path和statistics.mean,全程没用到
方法1:用numpy直接处理(高效简洁)
利用numpy的loadtxt直接读取文件,配合自定义转换器一步完成前缀去除和数值转换,避免多次循环和数组重复创建:
import numpy as np # 定义转换器:去掉字符串前2位,转成浮点数 def strip_prefix(s): return float(s.decode()[2:]) # 直接读取文件的第2、3列,用转换器处理前缀 data = np.loadtxt('serial_2.dat', usecols=(1, 2), converters={1: strip_prefix, 2: strip_prefix}, dtype=np.float32) # 计算每行的均值,再求整体均值 row_means = (data[:, 0] + data[:, 1]) / 2 overall_mean = np.mean(row_means) print(overall_mean)
方法2:用原生Python简化循环
如果不想依赖numpy,合并两次循环为一次,直接在读取行时完成数值提取,减少中间变量:
with open('serial_2.dat', 'r') as f: row_data = [] for line in f: parts = line.strip().split() if len(parts) == 3: # 确保行格式符合要求 # 直接提取前缀后的数值 sa_val = float(parts[1][2:]) sc_val = float(parts[2][2:]) row_data.append((sa_val, sc_val)) # 计算整体均值 row_means = [(a + b) / 2 for a, b in row_data] overall_mean = sum(row_means) / len(row_means) print(overall_mean)
方法3:用pandas处理(适合后续扩展)
如果之后还有更复杂的数据清洗、分析需求,pandas的批量处理会更省心:
import pandas as pd # 读取文件,用空格作为分隔符,指定列名 df = pd.read_csv('serial_2.dat', sep='\s+', names=['time', 'sa', 'sc']) # 批量提取前缀后的数值并转成浮点型 df['sa_val'] = df['sa'].str[2:].astype(float) df['sc_val'] = df['sc'].str[2:].astype(float) # 计算每行均值和整体均值 df['row_mean'] = (df['sa_val'] + df['sc_val']) / 2 overall_mean = df['row_mean'].mean() print(overall_mean)
内容的提问来源于stack exchange,提问作者msci
相关产品推荐
相关产品推荐

