I/O注册表 (astropy.io.registry
)#
备注
I/O注册表仅供希望定义自己的自定义读取器/写入器的用户直接使用。希望了解有关支持哪些内置格式的更多信息的用户 Table
默认情况下,应看到 统一文件读写接口 。同样, 宇宙学I/O与转换 对于受支持的内置格式 Cosmology
。当前没有为定义内置格式 NDData
,但这将在未来添加。
介绍#
自定义读/写函数#
本节演示如何创建自定义读写器。读取器是作为一个函数编写的,它可以接受除 format
(这是手动指定格式时需要的-请参见下文)并返回 Table
或 NDData
类(或子类)。
实例#
这里我们假设我们正在尝试为 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
格式,这样我们就可以构造一个函数来识别这些文件,在这里我们称之为 标识符 功能。
标识符函数应采用第一个参数,该参数是一个字符串,指示标识符是否从中调用 read
或 write
,然后应通过接受任意数量的位置参数和关键字参数 *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对象(或者 Table
或 NDData
类或子类),以及任何数量的后续位置参数和关键字参数 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
自定义注册表的用途是什么?
创建只读或只写注册表。
以允许相同格式的不同阅读器。
允许对象具有不同的 kinds 读者和作家的关系。例如。
Cosmology
它同时支持文件I/O和对象转换。