如何用Python正确加载含折列的多列数据并提取目标列?
问题描述
我有一个共7列的数据文件:1列时间列 + 6列数据列。数据格式特殊:
- 每行起始为时间列,后跟4列数据;
- 剩余2列数据被折行到下一行,行首带红色项目符号(作为换行标记),随后重复对应时间列,再跟原第5、6列数据。
尝试用Python的np.loadtxt加载时遇到问题:
- 执行
data = np.loadtxt('temp_59324.dat',delimiter = None)直接报错; - 仅指定加载5列(1时间+4数据)时能正常加载,但设置其他列数都会报错。
需求:
- 正确加载该格式的数据;
- 提取原数据的第5、6列;
- 方法需能推广到400列的场景(即每行先输出部分列,剩余列多次折行,每行带标记+重复时间列)。
补充:之前尝试的方案因代码中标记符号与文件实际符号不符,未生效;可获取目标数据文件。
解决方案
核心思路
文件中每一组完整数据对应两行:
- 第一行:
时间 数据1 数据2 数据3 数据4 - 第二行:
[特殊标记] 时间 数据5 数据6
处理逻辑:
- 逐行读取,将相邻两行配对;
- 去除第二行的特殊标记和重复时间列;
- 合并两行数据为完整的
时间 数据1-6格式; - 转换为数值数组,方便后续列提取。
代码实现
步骤1:读取并预处理数据
import numpy as np # 读取文件,过滤空行并去除首尾空白 with open('temp_59324.dat', 'r', encoding='utf-8') as f: lines = [line.strip() for line in f if line.strip()] # 每两行一组合并为完整数据行 full_data = [] for i in range(0, len(lines), 2): # 拆分第一行数据 line1 = lines[i].split() # 拆分第二行:去掉标记和重复时间,取剩余数据列 line2 = lines[i+1].split()[2:] # 合并为完整的一行数据 combined = line1 + line2 # 转换为数值类型 full_data.append([float(val) for val in combined]) # 转为numpy数组 data_array = np.array(full_data)
步骤2:提取目标列
data_array的列顺序为:时间列, 数据1, 数据2, 数据3, 数据4, 数据5, 数据6,提取原第5、6列(对应数组索引5、6):
# 提取原第5、6列 col5 = data_array[:, 5] col6 = data_array[:, 6] # 示例输出 print("第5列前5行:", col5[:5]) print("第6列前5行:", col6[:5])
推广到400列场景
如果是1时间列+399数据列,且需要多次折行(比如每3行一组完整数据),只需调整分组逻辑:
import numpy as np with open('large_data.dat', 'r', encoding='utf-8') as f: lines = [line.strip() for line in f if line.strip()] # 每组行数根据实际折行次数设置,比如3行一组 group_size = 3 full_data = [] for i in range(0, len(lines), group_size): # 取第一行的时间+前N列数据 combined = lines[i].split().copy() # 遍历后续折行,合并数据 for j in range(1, group_size): # 去掉标记和重复时间,合并剩余数据 combined.extend(lines[i+j].split()[2:]) # 转为数值 full_data.append([float(val) for val in combined]) data_array = np.array(full_data)
注意事项
- 如果读取文件出现乱码,尝试修改
encoding参数(如encoding='gbk'); - 若特殊标记位置不固定,先打印
lines[:5]查看行结构,调整分割逻辑; - 超大文件可采用逐行处理、边读边存的方式,避免内存占用过高。
内容的提问来源于stack exchange,提问作者kowalski
相关产品推荐
相关产品推荐

