ASCII表格 (astropy.io.ascii
)#
介绍#
astropy.io.ascii
提供通过内置ASCII数据表格式读取和写入各种ASCII数据表格式的方法 扩展读取器类 。重点是使用的灵活性和便利性,尽管读者可以选择使用灵活性较低的基于C语言的引擎进行读写,以提高性能。此子程序包最初开发为 asciitable
。
下面显示了一些可用的ASCII格式,而 Supported formats 包含完整列表。
Basic
:具有可自定义分隔符和标头配置的基本表Cds
: CDS format table (另请参阅Vizier)Daophot
:IRAF DAOphot包中的表FixedWidth
:具有固定宽度列的表(另请参见 固定宽度画廊 )HTML
:包含在<table>标记中的HTML格式表Latex
:数据值位于tabular
环境Mrt
:AAS Machine-Readable Tables (MRT) )
力量的力量 astropy.io.ascii
是对特定于天文学的格式(通常带有元数据)和专用数据类型的支持,例如 SkyCoord , Time ,以及 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也受以下支持 STIL 和 TOPCAT (见 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引擎兼容。
格式 |
写 |
快的 |
描述 |
---|---|---|---|
|
是的 |
|
|
|
是的 |
是的 |
|
|
是的 |
|
|
|
是的 |
是的 |
|
|
是的 |
是的 |
|
|
|
||
|
是的 |
|
|
|
是的 |
|
|
|
是的 |
|
|
|
是的 |
|
|
|
是的 |
|
|
|
是的 |
|
|
|
是的 |
|
|
|
是的 |
|
|
|
是的 |
是的 |
|
|
是的 |
|
|
|
是的 |
是的 |
|
|
是的 |
|
|
|
|
||
|
是的 |
是的 |
|
使用 astropy.io.ascii
#
使用细节 astropy.io.ascii
在以下章节中提供:
阅读表格#
书写表格#
ECSV格式#
固定宽度画廊#
快速ASCII引擎#
基类元素#
扩展读取器类#
性能提示#
默认情况下,当试图读取一个文件时,读取器会猜测其格式,这涉及到尝试使用许多不同的读取器来读取该文件。为了在处理大型表时获得更好的性能,建议显式指定格式和任何选项,并关闭猜测。
例子#
如果您正在读取一个简单的CSV文件,其中包含一行标题和列名,请执行以下操作:
read('example.csv', format='basic', delimiter=',', guess=False) # doctest: +SKIP
至少可以比以下速度快一个数量级:
read('example.csv') # doctest: +SKIP