如何高效读取文本文件并将多组节点-向量列重排为新行(寻求更优实现方案)
如何高效读取文本文件并将多组节点-向量列重排为新行(寻求更优实现方案)
嗨,你的需求我完全理解啦!你现在的代码其实已经能解决问题,但确实可以写得更通用、更简洁,不管是用纯Python还是Pandas都有优化空间,我给你两种方案参考:
纯Python通用优化版
你当前的代码是针对3个节点硬编码索引的,但实际场景是10个节点,这样写10次append会非常繁琐。我们可以改成循环处理任意数量的节点,代码灵活性会高很多,不用每次改节点数都手动调整索引:
N = 10 # 替换成你实际的节点数量(比如你说的10个) all_data = [] headline = "x y z vx vy vz" # 根据你的实际表头调整 with open(old_file, "r") as file1: next(file1) # 跳过首行,比readline更简洁直观 for line in file1: parts = line.strip().split() # 每行前3*N个元素是所有节点的坐标,后3*N个是对应向量 coord_segment = parts[:3*N] vector_segment = parts[3*N:] # 循环每个节点,拼接对应的坐标和向量 for i in range(N): # 取第i个节点的3个坐标值 node_coords = coord_segment[3*i : 3*(i+1)] # 取第i个节点对应的3个向量值 node_vector = vector_segment[3*i : 3*(i+1)] all_data.append(node_coords + node_vector) with open(new_file, "w") as file2: file2.write(f"{headline}\n") for row in all_data: file2.write(' '.join(row) + '\n')
这个版本的好处是:不管你是3个还是10个节点,只要修改N的值就行,不用硬编码一堆索引,维护起来方便太多,逻辑也更清晰。
Pandas高效实现方案
你提到尝试过Pandas但没得到正确结果,其实用Pandas可以实现非常高效的向量化处理,尤其适合你说的“几千行数据”的场景,这里给你两种写法:
写法1:快速重塑法(大数据量首选)
这种方法用Numpy的reshape直接批量处理所有数据,完全避开循环,性能最优:
import pandas as pd import numpy as np N = 10 # 实际节点数量 headline = ["x", "y", "z", "vx", "vy", "vz"] # 读取原文件,跳过首行,自动按空格分割列 df = pd.read_csv(old_file, sep="\s+", skiprows=1, header=None) # 把所有节点坐标重塑为(总节点数, 3)的数组 coords = df.iloc[:, :3*N].values.reshape(-1, 3) # 把所有向量值重塑为(总节点数, 3)的数组 vectors = df.iloc[:, 3*N:].values.reshape(-1, 3) # 合并坐标和向量,生成结果DataFrame result_df = pd.DataFrame(np.hstack([coords, vectors]), columns=headline) # 写入新文件 result_df.to_csv(new_file, sep=" ", index=False, header=True)
写法2:列拆分法(逻辑更直观)
如果你更偏好Pandas的DataFrame操作逻辑,也可以用列拆分的方式实现:
import pandas as pd N = 10 headline = ["x", "y", "z", "vx", "vy", "vz"] # 生成所有坐标列和向量列的名称 coord_cols = [f"node_{i}_{axis}" for i in range(N) for axis in ["x", "y", "z"]] vector_cols = [f"vec_{i}_{axis}" for i in range(N) for axis in ["x", "y", "z"]] # 读取文件,指定列名 df = pd.read_csv(old_file, sep="\s+", skiprows=1, names=coord_cols + vector_cols) # 初始化结果列表 result_rows = [] for i in range(N): # 提取第i个节点的坐标和向量列 node_data = df[[f"node_{i}_x", f"node_{i}_y", f"node_{i}_z", f"vec_{i}_x", f"vec_{i}_y", f"vec_{i}_z"]] node_data.columns = headline result_rows.append(node_data) # 合并所有节点数据 result_df = pd.concat(result_rows, ignore_index=True) # 写入文件 result_df.to_csv(new_file, sep=" ", index=False, header=True)
两种Pandas方案里,第一种reshape的写法速度最快,适合处理超大规模的数据集;第二种逻辑更直观,适合新手理解。
备注:内容来源于stack exchange,提问作者user29975383
相关产品推荐
相关产品推荐

