如何将 QTable 保存到文件(.txt、.csv 等)

How to save a QTable to a file (.txt, .csv, etc.)

我正在尝试将源自椭圆等光度拟合的等光度列表的 QTable 对象保存为真正允许我将其加载回脚本而无需清理它或任何类似的东西。

example_isolist = ellipse_example.fit_image(sclip=3., nclip=3) #performing elliptical isophote fit and creating the Isophote list
example_isolist_tab = example_isolist.to_table() #converting to QTable
import json
with open("example_isolist_tab.txt", 'w') as f:
    json.dump(example_isolist_tab, f, indent=2)

这里使用json是不行的。出现以下错误:

TypeError: Object of type QTable is not JSON serializable

这里有人有 photutils 数据处理或将等光度图保存到文件的经验吗? 这真的应该是一件非常简单的事情,只是一种方式,这样我就不必在每次想要使用 isophote 拟合的结果时都重新运行我的整个脚本。我的整个数据集包含 26 张图像,这意味着大约 2.5 小时的计算时间,中间没有保存。

提前致谢!

Astropy 已经有很多 built-in formats for saving Tables with Table.write.

特别是对于 QTable,如果您想要一种可往返的基于文本的格式,强烈建议使用 ECSV 格式,因为它还会输出有关每一列的类型和单位的元数据。如果您使用 .ecsv 扩展名命名文件,则会自动使用此格式。例如:

>>> from astropy.table import QTable
>>> import astropy.units as u
>>> import numpy as np

>>> a = np.array([1, 4, 5], dtype=np.int32)
>>> b = [2.0, 5.0, 8.5]
>>> c = ['x', 'y', 'z']
>>> d = [10, 20, 30] * u.m / u.s

>>> t = QTable([a, b, c, d],
...            names=('a', 'b', 'c', 'd'),
...            meta={'name': 'first table'})

>>> t.write('table.ecsv')
>>>  print(open('table.ecsv').read())
# %ECSV 0.9
# ---
# datatype:
# - {name: a, datatype: int32}
# - {name: b, datatype: float64}
# - {name: c, datatype: string}
# - {name: d, unit: m / s, datatype: float64}
# meta:
#   __serialized_columns__:
#     d:
#       __class__: astropy.units.quantity.Quantity
#       unit: !astropy.units.Unit {unit: m / s}
#       value: !astropy.table.SerializedColumn {name: d}
#   name: first table
# schema: astropy-2.0
a b c d
1 2.0 x 10.0
4 5.0 y 20.0
5 8.5 z 30.0

>>> QTable.read('table.ecsv')
<QTable length=3>
  a      b     c      d   
                    m / s 
int32 float64 str1 float64
----- ------- ---- -------
    1     2.0    x    10.0
    4     5.0    y    20.0
    5     8.5    z    30.0

使用astropyECSV writer无损写一个QTable:

>>> example_isolist_tab.write('example_isolist_tab.ecsv')
>>> t = QTable.read('example_isolist_tab.ecsv')  # returns the same table