文本表格 (astropy.io.ascii )#

astropy.io.ascii 提供通过内置读写各种文本数据表格式的方法 扩展读取器类 .重点是使用的灵活性和便利性,尽管读者可以选择使用灵活性较低的基于C的引擎进行读写以提高性能。

备注

强烈建议使用 Unified I/O Text Tables 界面而不是使用 astropy.io.ascii 直接.

对于读取大型CSV文件, PyArrow CSV 阅读器是最快的选择,而对于将大型数据表写入CSV, Table - Pandas interface 是一个可以考虑的选择。

更多信息请参阅 Unified I/OUnified I/O Table Data 页面.

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

的强度 astropy.io.ascii 是对天文学特定格式(通常带有元数据)和专用数据类型(如 SkyCoord , Time ,而且 Quantity .

入门#

阅读表格#

大多数常见的文本表都可以使用 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() 函数提供了一种将数据表编写为格式化文本表的方法。 大部分输入表 支持的格式 阅读也可用于写作。这为写作格式提供了很大的灵活性。

以下显示如何使用 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 包(请参见 高级统一文件I/O 以了解更多详细信息)。例如::

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

注意

建议使用ECSV

对于表格的可复制文本版本,我们建议使用 ECSV格式 .这将所有表元数据(特别是列类型和单位)存储到开头的注释部分,同时保持与大多数普通CSV阅读器的兼容性。它还允许存储更丰富的数据,如 SkyCoord 或多维或可变长度列。ECSV在Java中也得到了 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 下面给出了文本表的值和相应的格式类型。的 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 :带制表符分隔值的基本表

tdat

是的

Tdat :可移植数据库聚合表格式

获得帮助#

某些格式具有额外的选项,可以设置这些选项来控制读者或作家的行为。有关这些选项的更多信息,您可以查看特定格式类的文档(例如 HTML )或使用 help 功能 readwrite 功能协调发展的例如:

>>> ascii.read.help()  # Common help for all formats
>>> ascii.read.help("html")  # Common help plus "html" format-specific args
>>> ascii.write.help("latex")  # Common help plus "latex" format-specific args

使用 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#