表格数据#
的 QTable 和 Table 类包括两种方法, read() 和 write() ,这使得可以读取和写入文件。支持多种格式(请参阅 Built-in table readers/writers )并且可以在 Table 类(请参阅 I/O Registry ).
表格格式
要使用此接口,请首先导入 Table 同学们,然后打电话给 Table read() 方法,例如文件名和文件格式 'ascii.daophot' :
>>> from astropy.table import Table
>>> t = Table.read('photometry.dat', format='ascii.daophot')
可以使用URL直接从互联网加载表。例如,从CDS格式的Vizier目录下载表格 ('ascii.cds' ):
>>> from astropy.table import Table
>>> t = Table.read("ftp://cdsarc.unistra.fr/pub/cats/VII/253/snrs.dat",
... readme="ftp://cdsarc.unistra.fr/pub/cats/VII/253/ReadMe",
... format="ascii.cds")
对于某些文件格式,可以自动检测格式,例如,从文件扩展名:
>>> t = Table.read('table.tex')
对于写入表,可以显式指定格式:
>>> t.write(filename, format='latex')
至于 read() 方法,在某些情况下可能会自动识别格式。
底层文件处理程序还将自动检测各种压缩数据格式,并在Python安装支持的范围内解压缩它们(请参阅 get_readable_fileobj() ).
对于编写,还可以指定有关 Table serialization methods 通过 serialize_method 关键字参数。这允许精确控制写出某些列的方式,例如将ISO格式的时间列作为一对JD1/JD2浮点值(用于完全解析)或格式化的ISO日期字符串。
内置表读写器#
的 Table 类内置支持各种输入和输出格式,包括 astropy.io.ascii , FITS , HDF5 , Pandas , 镶木地板 ,而且 VO表 .
支持的格式和相应的类的完整列表如下表所示。这个 Write 列指示那些支持写入功能的格式,以及 Suffix 列指示指示特定格式的文件名后缀。如果 Suffix 是 auto ,则从文件本身自动检测格式。并非所有格式都支持自动检测。
格式 |
写 |
后缀 |
描述 |
|---|---|---|---|
ASCII码 |
是的 |
大多数支持格式的文本表(使用猜测) |
|
ascii.aastex |
是的 |
|
|
ascii.basic |
是的 |
|
|
ascii.cds |
不 |
|
|
ascii.commented_header |
是的 |
|
|
ascii.csv |
是的 |
.csv文件 |
|
ascii.daophot |
不 |
|
|
ascii.ecsv |
是的 |
.ecsv系统 |
|
ascii.fixed_width |
是的 |
|
|
ascii.fixed_width_no_header |
是的 |
|
|
ascii.fixed_width_two_line |
是的 |
|
|
ascii.html |
是的 |
.html格式 |
|
ascii.ipac |
是的 |
|
|
ascii.latex |
是的 |
.tex公司 |
|
ascii.mrt |
是的 |
|
|
ascii.no_header |
是的 |
|
|
ascii.qdp |
是的 |
.qdp |
|
ascii.rdb |
是的 |
.rdb文件 |
|
ascii.rst |
是的 |
.重新设置 |
|
ascii.sextractor |
不 |
|
|
ascii.tab |
是的 |
|
|
ascii.tdat |
是的 |
.tdat |
|
适合 |
是的 |
汽车 |
|
hdf5型 |
是的 |
汽车 |
HDF5 :分层数据格式二进制文件 |
jsviewer |
是的 |
JavaScript查看器格式(只写) |
|
pandas.csv |
是的 |
||
pandas.fwf |
不 |
|
|
pandas.html |
是的 |
||
pandas.json |
是的 |
||
镶木地板 |
是的 |
汽车 |
Parquet :Apache Parquet二进制文件 |
parquet.votable |
是的 |
带有VOmetals表的拼花文件 |
|
pyarrow.csv |
不 |
|
|
可听的 |
是的 |
汽车 |
|
votable.parquet |
是的 |
VOTables的拼花系列化。指定此格式进行写入,读取是自动的。 |
细节#
表序列化方法#
astropy 支持对写出(序列化)表中列的方式进行细粒度控制。例如,如果您要将ISO格式的时间列写入ECSV文本表文件,则您可能希望将其写入一对JD 1/JD 2浮点值以实现全分辨率(完美的“往返”),或者作为格式化的ISO日期字符串,以便您的其他应用程序可以轻松阅读这些值。
序列化的默认方法取决于格式(FITS、ECSV、HDF 5)。例如,HDF 5是一种二进制格式,因此将Time对象存储为JD 1/JD 2是有意义的,而ECSV是一种平面文本格式,通常您希望以与Time对象相同的格式查看日期。默认值还反映了试图最大限度地减少之间的兼容性问题 astropy 版本.例如,在能够作为JD 1/JD 2对写入之前的版本中,可以将时间列作为格式化字符串写入ECSV,因此ECSV的当前默认值是作为格式化字符串写入。
具有可配置序列化方法的两个类是 Time 和 MaskedColumn .每种格式的默认值如下:
格式 |
时间 |
MaskedColumn |
|---|---|---|
FITS |
|
|
ECSV |
|
|
HDF5 |
|
|
YAML |
|
--- |
实例#
首先创建一个具有时间列和屏蔽列的表::
>>> import sys
>>> from astropy.time import Time
>>> from astropy.table import Table, MaskedColumn
>>> t = Table(masked=True)
>>> t['tm'] = Time(['2000-01-01', '2000-01-02'])
>>> t['mc1'] = MaskedColumn([1.0, 2.0], mask=[True, False])
>>> t['mc2'] = MaskedColumn([3.0, 4.0], mask=[False, True])
>>> t
<Table masked=True length=2>
tm mc1 mc2
Time float64 float64
----------------------- ------- -------
2000-01-01 00:00:00.000 -- 3.0
2000-01-02 00:00:00.000 2.0 --
现在指定您想要所有 Time 写为JD 1/JD 2的列和 mc1 列作为数据/掩码对写入ECSV::
>>> serialize_method = {Time: 'jd1_jd2', 'mc1': 'data_mask'}
>>> t.write(sys.stdout, format='ascii.ecsv', serialize_method=serialize_method)
# %ECSV 1.0
...
# schema: astropy-2.0
tm.jd1 tm.jd2 mc1 mc1.mask mc2
2451544.0 0.5 1.0 True 3.0
2451546.0 -0.5 2.0 False ""
(为清楚起见,增加了空格)
请注意, tm 列已替换为 tm.jd1 和 tm.jd2 列,同样也是一个新列 mc1.mask 已出现,并且它显式包含掩码值。当使用 ascii.ecsv 读取器,则重建原始列。
这个 serialize_method 参数可以用两种不同的方式设置:
就像一根弦
data_mask. 然后,该值将应用于每一列,对于没有时间列的屏蔽表来说,这是一种方便的策略。作为一个
dict,其中键可以是单个列名或类(如上面的示例所示),值是相应的序列化方法。
读取和写入列对象#
各个表列没有自己的读写功能,但很容易从表中仅选择一列(此处为“obetime”)进行写入:
>>> from astropy.time import Time
>>> tab = Table({'name': ['AB Aur', 'SU Aur'],
... 'obstime': Time(['2013-05-23T14:23:12', '2011-11-11T11:11:11'])})
>>> tab[['obstime']].write('obstime.fits')
注意符号 [['obstime']] 在最后一行中,用字符串列表对表进行索引,为我们提供了一个新表,其中包含字符串给出的列。由于内部列表只有一个元素,因此结果表只有一列。
然后,我们可以读回该单列表并从中提取列::
>>> col = Table.read('obstime.fits').columns[0]
>>> type(col)
<class 'astropy.table.column.Column'>
关于文件名的注释#
这两个 read() 和 write() 方法可以接受以下形式的文件路径 ~/data/file.csv 或 ~username/data/file.csv 。这些以代字号为前缀的路径的展开方式与许多命令行实用程序相同,分别表示当前用户或指定用户的主目录。
命令行实用程序#
备注
在v7.1中, showtable 为了避免Debian上的名称冲突,现在不建议使用命令;使用 showtable-astropy 而不是.在将来的版本中将删除不推荐使用的命令。
为了方便起见,命令行工具 showtable-astropy 可用于打印统一I/O接口支持的格式的表格内容。
例子#
要在命令行上查看表的内容,请执行以下操作:
$ showtable-astropy astropy/io/fits/tests/data/table.fits
target V_mag
------- -----
NGC1001 11.1
NGC1002 12.3
NGC1003 15.2
要获取有关使用和可用选项的完整文档,请执行 showtable-astropy --help .