You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何提取.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 08:57:38