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

如何用Pandas read_csv适配FORTRAN格式的原子质量数据文件?

解决方案:用固定宽度读取适配Fortran格式文件

你的问题出在用分隔符读取固定宽度文件——这个IAEA的原子质量文件是标准的Fortran固定列宽格式,不是空格分隔的CSV,所以sep='\s+'会因为字段内空格/多空格导致列对齐错误。正确的做法是用Pandas的read_fwf()(Fixed Width Format)来读取,直接利用文件提供的Fortran格式信息。

步骤1:解析Fortran格式生成列位置

文件里的格式字符串可以直接转换成Pandas需要的列位置(colspecs),也可以写个小工具函数自动解析:

def parse_fortran_format(fmt_str):
    parts = fmt_str.split(',')
    current_pos = 0
    colspecs = []
    for part in parts:
        part = part.strip()
        if part == '1x':  # 跳过空格占位符
            current_pos += 1
            continue
        # 提取格式中的宽度数字(如a1→1,f14.6→14)
        width = int(''.join([c for c in part if c.isdigit()]))
        colspecs.append((current_pos, current_pos + width))
        current_pos += width
    return colspecs

# 传入文件里的格式字符串
fortran_fmt = 'a1,i3,i5,i5,i5,1x,a3,a4,1x,f14.6,f12.6,f13.5,1x,f10.5,1x,a2,f13.5,f11.5,1x,i3,1x,f13.6,f12.6'
colspecs = parse_fortran_format(fortran_fmt)

步骤2:用read_fwf()读取文件

用生成的colspecs指定每列的起止位置,配合你原来的列名、跳过行参数:

import pandas as pd

masses = pd.read_fwf(
    'isotope_data/mass_1.mas20.txt',
    colspecs=colspecs,
    names=['1N', '-Z','N','Z','A','EL','0','Delta','eDelta','BE','eBE','DC','BeE','eBeE','AMU','AMU2','eAMU'],
    skiprows=36,
    skipfooter=2,
    engine='python'  # skipfooter需要python引擎支持
)

# 验证读取结果
print(masses.head())

步骤3:转换为NumPy数组

直接用DataFrame的to_numpy()方法转换单个列或整个数据集:

# 转换单个列
delta_np = masses['Delta'].to_numpy()

# 转换整个DataFrame
masses_np = masses.to_numpy()

为什么这个方法可行?

Fortran格式字符串里的a1/i3/f14.6本质是定义每列的固定宽度,1x是跳过的空格位。read_fwf()就是专门处理这类文件的,完全匹配这种格式逻辑,比read_csv更适合这个场景。

内容的提问来源于stack exchange,提问作者villaa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 03:03:22