ASCII表格 (astropy.io.ascii#

介绍#

astropy.io.ascii 提供通过内置ASCII数据表格式读取和写入各种ASCII数据表格式的方法 扩展读取器类 。重点是使用的灵活性和便利性,尽管读者可以选择使用灵活性较低的基于C语言的引擎进行读写,以提高性能。此子程序包最初开发为 asciitable

下面显示了一些可用的ASCII格式,而 Supported formats 包含完整列表。

力量的力量 astropy.io.ascii 是对特定于天文学的格式(通常带有元数据)和专用数据类型的支持,例如 SkyCoordTime ,以及 Quantity 。对于以通用格式(如CSV)读取或写入大型数据表,请使用 Table - Pandas interface 是一个需要考虑的选择。

备注

强烈建议您使用中的功能 astropy.io.ascii 通过中的更高级别接口 Data Tables 包裹。看见 统一文件读写接口 了解更多详细信息。

入门#

阅读表格#

大多数常见的ASCII表都可以用 read() 功能。假设您有一个名为 sources.dat 内容如下:

obsid redshift  X      Y     object
3102  0.32      4167  4085   Q1250+568-A
877   0.22      4378  3892   "Source 82"

此表可与以下内容一起阅读:

>>> from astropy.io import ascii
>>> data = ascii.read("sources.dat")  
>>> print(data)                       
obsid redshift  X    Y      object
----- -------- ---- ---- -----------
 3102     0.32 4167 4085 Q1250+568-A
  877     0.22 4378 3892   Source 82

第一个论点 read() 函数可以是文件名、表的字符串表示形式或表行列表。返回值 (data 在这种情况下)是 Table 对象。

默认情况下, read() 会尽力的 guess the table format 通过尝试 supported formats .

警告

对于大文件,猜测文件格式通常很慢,因为读者尝试用每种允许的格式解析文件,直到一种格式成功为止。对于大文件,建议禁用猜测 guess=False .

如果猜测格式不起作用,比如对于格式异常的表,您可能需要给出 astropy.io.ascii 关于格式的其他提示。

若要为一列或多列指定特定数据类型,请使用 converters 参数(请参见 用于指定数据类型的转换器 有关详细信息)。例如,如果 obsid 实际上是一个字符串标识符(而不是整数),您可以使用下面的代码读取表。这也说明了使用首选的 Table interface 阅读::

>>> from astropy.table import Table
>>> sources = """
... target observatory obsid
... TW_Hya Chandra     22178
... MP_Mus XMM         0406030101"""
>>> data = Table.read(sources, format='ascii', converters={'obsid': str})
>>> data
<Table length=2>
target observatory   obsid
 str6      str7      str10
------ ----------- ----------
TW_Hya     Chandra      22178
MP_Mus         XMM 0406030101

书写表格#

这个 write() 函数提供了一种将数据表编写为带格式的ASCII表的方法。输入表的大部分 支持的格式 可供阅读,也可用于写作。这为编写格式提供了极大的灵活性。

下面显示如何使用 write() 功能::

>>> import numpy as np
>>> from astropy.io import ascii
>>> from astropy.table import Table
>>> data = Table()
>>> data['x'] = np.array([1, 2, 3], dtype=np.int32)
>>> data['y'] = data['x'] ** 2
>>> ascii.write(data, 'values.dat', overwrite=True)

这个 values.dat 文件将包含:

x y
1 1
2 4
3 9

也可以并鼓励使用中的写入功能 astropy.io.ascii 通过中的更高级别接口 Data Tables 包(请参见 统一文件读写接口 以了解更多详细信息)。例如::

>>> data.write('values.dat', format='ascii', overwrite=True)

注意

建议使用ECSV

对于可重现的ASCII版本的表,我们建议使用 ECSV格式 。这会将所有表元数据(特别是列类型和单元)存储到开头的注释部分,同时保持与大多数普通CSV阅读器的兼容性。它还允许存储更丰富的数据,如 SkyCoord 或多维或可变长度列。在Java中,ECSV也受以下支持 STILTOPCAT (见 ECSV格式 )。

要将我们的简单示例表编写为ECSV,我们使用::

>>> data.write('values.ecsv', overwrite=True)  

这个 .ecsv 扩展被识别并隐含使用ECSV(相当于 format='ascii.ecsv' )。这个 values.ecsv 然后,文件将包含::

# %ECSV 1.0
# ---
# datatype:
# - {name: x, datatype: int32}
# - {name: y, datatype: int32}
# schema: astropy-2.0
x y
1 1
2 4
3 9

支持的格式#

支持的完整列表 format 下面给出了ASCII表的值和相应的格式类型。这个 Write 列指示哪些格式支持写入功能,并且 Fast 列指示哪些格式与用于读写的快速Cython/C引擎兼容。

格式

快的

描述

aastex

是的

AASTex :用于AAS期刊的AASTeX deluxetable

basic

是的

是的

Basic :带自定义分隔符的基本表

cds

是的

Cds :CDS格式表

commented_header

是的

是的

CommentedHeader :注释行中的列名

csv

是的

是的

Csv :带有逗号分隔值的基本表

daophot

Daophot :IRAF DAOphot格式表

ecsv

是的

Ecsv :增强的CSV格式( recommended )

fixed_width

是的

FixedWidth :固定宽度

fixed_width_no_header

是的

FixedWidthNoHeader :固定宽度,无标题

fixed_width_two_line

是的

FixedWidthTwoLine :具有第二条标题行的固定宽度

html

是的

HTML :HTML格式表

ipac

是的

Ipac :IPAC格式表

latex

是的

Latex : Latex 表

mrt

是的

Mrt :AAS机器可读表格格式

no_header

是的

是的

NoHeader :没有标题的基本表

qdp

是的

QDP :Quick和Dandy绘图仪文件

rdb

是的

是的

Rdb :用类型定义标题行分隔的选项卡

rst

是的

RST :restructedText简单格式表

sextractor

SExtractor :SExtractor格式表

tab

是的

是的

Tab :带制表符分隔值的基本表

使用 astropy.io.ascii#

使用细节 astropy.io.ascii 在以下章节中提供:

阅读表格#

书写表格#

ECSV格式#

快速ASCII引擎#

基类元素#

扩展读取器类#

性能提示#

默认情况下,当试图读取一个文件时,读取器会猜测其格式,这涉及到尝试使用许多不同的读取器来读取该文件。为了在处理大型表时获得更好的性能,建议显式指定格式和任何选项,并关闭猜测。

例子#

如果您正在读取一个简单的CSV文件,其中包含一行标题和列名,请执行以下操作:

read('example.csv', format='basic', delimiter=',', guess=False)  # doctest: +SKIP

至少可以比以下速度快一个数量级:

read('example.csv')  # doctest: +SKIP

参考/API#