如何提取.msh文件中含9列的行并转为数值数组?
提取MSH文件中9列行并转为数值数组的解决方案
问题背景
我有一个包含数千行、列数不一的.msh文本文件,所有数据以空格分隔。文件内容示例如下:
$MeshFormat 2.2 0 8 $EndMeshFormat $Nodes 2929 1 26.66002035140991 0.75 1.25 2 71.57912731170654 0.75 98.75 3 71.57912731170654 29.25 98.75 ...
我已经通过列表推导式筛选出了包含9列的行,但结果是字符串形式的,比如:
'2675 4 2 0 1 25 27 1223 2073\n'、'2676 4 2 0 1 252 272 271 1904\n'
而我需要将这些数据转换为数值数组形式,比如:
[[2675, 4, 2, 0, 1, 25, 27, 1223, 2073],[2676, 4, 2, 0, 1, 252, 272, 271, 1904],...]
下面是基于numpy和pandas的两种实用解决方案:
方案一:使用Numpy(适合大文件,效率优先)
如果你的文件体积较大,优先用numpy的loadtxt配合过滤函数,它不需要把所有数据一次性读进内存,处理效率更高:
import numpy as np def keep_9_col_lines(line): # 跳过空行,判断分割后列数是否为9 stripped_line = line.strip() if not stripped_line: return False return len(stripped_line.split()) == 9 # 加载文件并过滤,直接转为数值数组 # dtype根据你的数据调整:整数用int,浮点数用float result = np.loadtxt('my_file', dtype=int, filter_func=keep_9_col_lines, encoding='utf-8') print(result)
注意:
filter_func是numpy 1.23及以上版本才有的参数,如果你的numpy版本较低,可以用下面的兼容写法:
import numpy as np with open('my_file', 'r') as f: # 筛选行并转换为数值列表 filtered_rows = [list(map(int, line.strip().split())) for line in f if len(line.strip().split()) == 9] # 转为numpy数组 result = np.array(filtered_rows)
方案二:使用Pandas(适合后续数据处理)
如果你之后还要对这些数据做分析、筛选等操作,用pandas会更灵活,后续扩展操作更方便:
import pandas as pd # 读取文件,用任意数量的空格作为分隔符,不设表头 df = pd.read_csv('my_file', sep=r'\s+', header=None, engine='python') # 筛选出非空列数等于9的行(列数不足的行会被填充NaN) filtered_df = df[df.notna().sum(axis=1) == 9] # 转换为数值数组(如果不需要DataFrame的话) result = filtered_df.values.astype(int) # 或者直接保留DataFrame用于后续操作: # print(filtered_df)
解释:
sep=r'\s+'可以处理连续空格的情况,完美适配.msh文件的分隔格式- 如果数据包含浮点数,把
astype(int)改为astype(float)即可,或者直接去掉让pandas自动推断类型
内容的提问来源于stack exchange,提问作者Link_tester
相关产品推荐
相关产品推荐

