如何加载末尾行缺失的(636,800)维度txt数据?
处理不完整列数的TXT数据加载方案
针对你遇到的最后一行数据截断、列数不足的TXT文件,以下几种方法可以有效加载数据:
1. 逐行读取+手动补全缺失列
这是最直接可控的方案,逐行读取文件内容,对每行数据做分割后,将不足800列的行补0到目标列数,最后统一转为numpy数组:
import numpy as np TARGET_COLS = 800 data_rows = [] with open("truncated_file.txt", "r") as f: for line in f: # 分割行内数据,自动处理多余空格/制表符 row_data = list(map(float, line.strip().split())) # 补全到目标列数,不足的位置填0 if len(row_data) < TARGET_COLS: row_data += [0.0] * (TARGET_COLS - len(row_data)) # 若存在列数超过的情况(极少),直接截断到800列 elif len(row_data) > TARGET_COLS: row_data = row_data[:TARGET_COLS] data_rows.append(row_data) # 转为numpy数组 final_data = np.array(data_rows) print(final_data.shape) # 输出为(实际行数, 800)
2. 预处理文件后再加载
如果不想在加载时处理,可以先通过脚本将截断的文件修复,补全最后一行的缺失列,再用np.loadtxt正常加载:
import numpy as np TARGET_COLS = 800 input_path = "truncated_file.txt" output_path = "fixed_file.txt" with open(input_path, "r") as in_f, open(output_path, "w") as out_f: for line in in_f: row_data = line.strip().split() if len(row_data) < TARGET_COLS: # 补全缺失的数值位(用空格分隔,符合原文件格式) row_data += ["0.0"] * (TARGET_COLS - len(row_data)) fixed_line = " ".join(row_data) + "\n" out_f.write(fixed_line) else: out_f.write(line) # 用loadtxt加载修复后的文件 data = np.loadtxt(output_path)
为什么之前的方法无效?
np.genfromtxt的filling_values参数仅适用于列数正确但存在缺失值的场景(比如某行有800个分隔位置但部分值为空),而你的文件是最后一行直接截断,列数本身不足,因此该参数无法生效。- 直接将非均匀长度的列表转为numpy数组会失败,因为numpy要求二维数组的每行长度必须一致,必须先统一每行长度才能转换。
内容的提问来源于stack exchange,提问作者matt
相关产品推荐
相关产品推荐

