如何在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',而不是被转成整数后的11、51。
原理其实很简单:astropy默认会自动推断列的类型,把数字字符串识别成整数,自然就丢了前导零;而我们通过formats强制指定第二列为字符串类型,读取时就会保留原始的字符内容啦。
内容的提问来源于stack exchange,提问作者N_Z




