I/O注册表 (astropy.io.registry#

备注

I/O注册表仅供希望定义自己的自定义读取器/写入器的用户直接使用。希望了解有关支持哪些内置格式的更多信息的用户 Table 默认情况下,应看到 统一文件读写接口 。同样, 宇宙学I/O与转换 对于受支持的内置格式 Cosmology 。当前没有为定义内置格式 NDData ,但这将在未来添加。

介绍#

I/O注册表是一个子模块,用于定义可用于 TableNDData ,以及 Cosmology 上课。

自定义读/写函数#

本节演示如何创建自定义读写器。读取器是作为一个函数编写的,它可以接受除 format (这是手动指定格式时需要的-请参见下文)并返回 TableNDData 类(或子类)。

实例#

这里我们假设我们正在尝试为 Table 班级:

>>> from astropy.table import Table

>>> def my_table_reader(filename, some_option=1):
...     # Read in the table by any means necessary
...     return table  # should be an instance of Table

这样的函数可以注册到I/O注册表中:

from astropy.io import registry
registry.register_reader('my-table-format', Table, my_table_reader)

其中第一个参数是格式的名称,第二个参数是函数返回实例的类,第三个参数是读取器本身。

然后我们可以在一个表格中阅读:

d = Table.read('my_table_file.mtf', format='my-table-format')

实际上,最好有 read 方法自动标识此文件位于 my-table-format 格式,这样我们就可以构造一个函数来识别这些文件,在这里我们称之为 标识符 功能。

标识符函数应采用第一个参数,该参数是一个字符串,指示标识符是否从中调用 readwrite ,然后应通过接受任意数量的位置参数和关键字参数 *args**kwargs ,它们是传递给 read 方法。

在上面的例子中,我们可以编写一个只查看文件名的函数(但实际上,这个函数甚至可以查看文件的前几个字节)。identifier函数的唯一要求是,它返回一个布尔值,指示输入是否与预期的格式匹配。在我们的示例中,我们希望自动识别文件名以结尾的文件 .mtf 就像在 my-table-format 格式::

import os

def identify_mtf(origin, *args, **kwargs):
    return (isinstance(args[0], str) and
            os.path.splitext(args[0].lower())[1] == '.mtf')

备注

标识符函数应该为任意输入做好准备—特别是,第一个参数可能不是文件名或文件对象,因此不应假定是这种情况。

然后注册这个标识符函数,类似于reader函数:

registry.register_identifier('my-table-format', Table, identify_mtf)

注册此函数后,我们可以执行以下操作:

t = Table.read('catalog.mtf')

如果多个格式与当前输入匹配,则引发异常,如果没有与当前输入匹配的格式,则会引发异常。在这种情况下,格式应该用 format= 关键字参数。

也可以创建自定义编写器。为了使用上面的定制阅读器,我们可以编写一个自定义的writer::

def my_table_writer(table, filename, overwrite=False):
    ...  # Write the table out to a file
    return ...  # generally None, but other values are not forbidden.

Writer函数应该使用一个dataset对象(或者 TableNDData 类或子类),以及任何数量的后续位置参数和关键字参数 format 不能使用关键字参数。

然后注册作者:

registry.register_writer('my-custom-format', Table, my_table_writer)

我们可以把表写到一个文件中:

t.write('catalog_new.mtf', format='my-table-format')

既然我们已经注册了identifier函数,我们还可以:

t.write('catalog_new.mtf')

本地注册表和默认注册表#

在 5.0 版本发生变更.

从Astropy 5.0开始,I/O注册表子模块已切换到基于类的体系结构,允许创建自定义注册表。支持的三种注册表类型是只读的-- UnifiedInputRegistry --只写-- UnifiedOutputRegistry --和读/写-- UnifiedIORegistry

>>> from astropy.io.registry import UnifiedIORegistry
>>> example_reg = UnifiedIORegistry()
>>> print([m for m in dir(example_reg) if not m.startswith("_")])
['available_registries', 'delay_doc_updates', 'get_formats', 'get_reader',
 'get_writer', 'identify_format', 'read', 'register_identifier',
 'register_reader', 'register_writer', 'unregister_identifier',
 'unregister_reader', 'unregister_writer', 'write']

为了向后兼容,此注册表上的所有方法都有相应的模块级函数,这些函数使用默认的全局读/写注册表。这些函数在前面的示例中使用过。此新注册表为空。

>>> example_reg.get_formats()
<Table length=0>
Data class  Format   Read   Write  Auto-identify
 float64   float64 float64 float64    float64
---------- ------- ------- ------- -------------

我们可以使用此注册表对象注册读/写/标识方法:

>>> example_reg.register_reader('my-table-format', Table, my_table_reader)
>>> example_reg.get_formats()
<Table length=1>
Data class      Format     Read Write Auto-identify
   str5         str15      str3  str2      str2
---------- --------------- ---- ----- -------------
     Table my-table-format  Yes    No            No

自定义注册表的用途是什么?

  1. 创建只读或只写注册表。

  2. 以允许相同格式的不同阅读器。

  3. 允许对象具有不同的 kinds 读者和作家的关系。例如。 Cosmology 它同时支持文件I/O和对象转换。

参考/API#