如何用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
相关产品推荐
相关产品推荐

