<p>使用<code>astropy.io.ascii</code>您应该能够相对容易地读取文件:</p>
<pre><code>from astropy.io import ascii
# Give names for ALL of the columns, as there is no easy way to skip columns
# for a table with no column header.
colnames = ('sn', 'gal_name1', 'gal_name2', 'year', 'month', 'day', ...)
table = ascii.read('sn_full.txt', Reader=ascii.NoHeader, names=colnames)
</code></pre>
<p>这将为您提供一个包含所有数据列的表。事实上,您有一些不需要的列不是问题,除非表是大行长的。对于您展示的表,您不需要显式地指定数据类型,因为<code>io.ascii.read</code>将正确地确定它们。在</p>
<p>这里的一个小问题是,您所显示的表实际上是一个固定宽度的表,这意味着所有列都垂直排列。请注意,第一行以<code>1998S NGC 3877</code>开头。只要每一行都有相同的模式,用三个空格分隔的列来表示超新星的名称和星系的名称,就可以了。但是如果任何一个星系名称是一个单词,那么解析将失败。我怀疑如果IDL <code>readcol</code>正在工作,那么相应的<code>io.ascii</code>版本应该可以开箱即用。如果不是,那么<code>io.ascii</code>有一种读取固定宽度表的方法,在表中显式地提供列名和位置。在</p>
<p>[编辑]
在本例中,似乎需要一个固定宽度的读取器来通知解析器如何拆分列,而不是仅仅使用空格作为分隔符。因此,基本上需要在表文件的顶部添加两行,第一行给出列名,第二行用破折号表示每列的跨度:</p>
^{pr2}$
<p>在<code>astropy.io.ascii</code>中,如果不能修改输入数据文件,也可以通过代码指定每列的开始和停止位置,例如:</p>
<pre><code>>>> ascii.read(table, Reader=ascii.FixedWidthNoHeader,
names=('Name', 'Phone', 'TCP'),
col_starts=(0, 9, 18),
col_ends=(5, 17, 28),
)
</code></pre>