3

我正在使用 Python 2.7.10 和 pyfits 3.3。早些时候,我使用以下代码合并两个表。但是,现在我遇到了一些错误

t1 = pyfits.open(table1)[1].columns
t2 = pyfits.open(table2)[1].columns
new_columns = t1 + t2
hdu = pyfits.BinTableHDU.from_columns(new_columns)
hdu.writeto(outtable)

错误是:

Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
 File "/home/vvikraman/anaconda2/lib/python2.7/site-packages/pyfits/hdu/table.py", line 116, in from_columns
    data = FITS_rec.from_columns(coldefs, nrows=nrows, fill=fill)
 File "/home/vvikraman/anaconda2/lib/python2.7/site-packages/pyfits/fitsrec.py", line 315, in from_columns
    if arr.hdu.data is None:
ReferenceError: weakly-referenced object no longer exists
4

2 回答 2

4

您是否有理由不能使用astropy(即astropy.io.fits)?

在这种情况下,成语将是:

from astropy.table import Table, hstack
t1 = Table.read(table1)
t2 = Table.read(table2)
new = hstack([t1, t2])
new.write(outtable)

readwrite调用中,您需要提供format='fits'表名扩展是否不暗示它是 FITS。

于 2015-11-22T10:56:52.117 回答
3

这有点令人困惑,我不是 100% 确定原因,但这是我的猜测:

打开文件本身的结果,pyfits.open(...)没有分配给任何东西,因为您立即访问第二个 HDU 的列。这给了你一个弱参考:本质上,实际数据不再可用,因为文件在某种意义上(可能是真实的,我还没有检查过)是关闭的。
Pyfits 这样做是为了节省内存。

令人困惑的部分是,在分配了t1and之后t2,您仍然可以打印它们的定义,所以看起来实际的列就在附近。实际上,仍然存在列定义:无法检索实际数据。因此,当您尝试从 和 组合创建新的二进制 HDU 时t1t2您需要实际数据时,事情就失败了。

解决方案是确保您保留对数据的正确引用。可能有多种方法可以做到这一点;这似乎对我有用:

hdulist1 = pyfits.open(table1)
hdulist2 = pyfits.open(table2)
t1 = hdulist1[1].columns
t2 = hdulist2[1].columns
new_columns = t1 + t2
hdu = pyfits.BinTableHDU.from_columns(new_columns)
hdu.writeto(outtable)
# explicitly close the HDUs; might free up memory
hdulist1.close()
hdulist2.close()
于 2015-11-22T10:34:44.757 回答