You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在astropy.io.ascii.read中指定各列的单独读取格式?

解决astropy读取文件时指定列格式的问题

我刚好遇到过类似的需求,这就给你讲两种实用的方法来指定列的读取格式,保住第二列的前导零:

方法一:直接在read函数中指定格式(最常用)

如果你的文件是空格分隔的每行两列数据,直接用formats参数配合列名或者位置索引来指定类型就行:

用列名指定

import astropy.io.ascii as ascii

# 读取时自定义列名,并指定每列的格式
data = ascii.read(
    'file.in',
    names=['序号', '编码'],  # 可以换成你需要的列名
    formats={'序号': int, '编码': str},  # 第一列整数,第二列字符串
    delimiter=' '  # 告诉astropy用空格分隔字段
)

用位置索引指定

如果不想自定义列名,也可以按列的顺序直接指定格式:

data = ascii.read(
    'file.in',
    formats=[int, str],  # 第一列int,第二列str,按顺序对应
    delimiter=' '
)

方法二:固定宽度格式读取(适合字段长度固定的情况)

如果你的第二列是固定长度的(比如都是4位),也可以用固定宽度的方式读取,同时指定格式:

data = ascii.read(
    'file.in',
    format='fixed_width',
    col_starts=[0, 2],  # 第一列从第0个字符开始,第二列从第2个字符开始
    col_ends=[1, 6],    # 第一列到第1个字符结束,第二列到第6个字符结束
    formats=[int, str]
)

验证效果

读取完成后,你可以打印第二列看看:

print(data['编码'])  # 或者data.columns[1],取决于你有没有指定列名

这时应该能看到完整的带前导零的字符串,比如'0011''0101',而不是被转成整数后的1151

原理其实很简单:astropy默认会自动推断列的类型,把数字字符串识别成整数,自然就丢了前导零;而我们通过formats强制指定第二列为字符串类型,读取时就会保留原始的字符内容啦。

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

火山引擎 最新活动