文本表格 (astropy.io.ascii
)#
astropy.io.ascii
提供通过内置读写各种文本数据表格式的方法 扩展读取器类 .重点是使用的灵活性和便利性,尽管读者可以选择使用灵活性较低的基于C的引擎进行读写以提高性能。
备注
强烈建议使用 Unified I/O Text Tables 界面而不是使用 astropy.io.ascii
直接.
对于读取大型CSV文件, PyArrow CSV 阅读器是最快的选择,而对于将大型数据表写入CSV, Table - Pandas interface 是一个可以考虑的选择。
更多信息请参阅 Unified I/O 和 Unified I/O Table Data 页面.
以下显示了一些可用的文本格式,而 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 .
入门#
阅读表格#
大多数常见的文本表都可以使用 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中也得到了 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
下面给出了文本表的值和相应的格式类型。的 Write
列指示哪些格式支持写入功能, Fast
列指示哪些格式与快速Cython/C引擎兼容用于读写。
格式 |
写 |
快的 |
描述 |
---|---|---|---|
|
是的 |
|
|
|
是的 |
是的 |
|
|
是的 |
|
|
|
是的 |
是的 |
|
|
是的 |
是的 |
|
|
|
||
|
是的 |
|
|
|
是的 |
|
|
|
是的 |
|
|
|
是的 |
|
|
|
是的 |
|
|
|
是的 |
|
|
|
是的 |
|
|
|
是的 |
|
|
|
是的 |
是的 |
|
|
是的 |
|
|
|
是的 |
是的 |
|
|
是的 |
|
|
|
|
||
|
是的 |
是的 |
|
|
是的 |
|
获得帮助#
某些格式具有额外的选项,可以设置这些选项来控制读者或作家的行为。有关这些选项的更多信息,您可以查看特定格式类的文档(例如 HTML
)或使用 help
功能 read
或 write
功能协调发展的例如:
>>> 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