如何将两个表与pyfits合并?

时间:2015-11-22 01:26:35

标签: python astropy pyfits

我正在使用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

2 个答案:

答案 0 :(得分:3)

这有点令人困惑,我对这个原因并不是百分之百确定,但我的猜测是这样的:

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

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

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

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()

答案 1 :(得分:3)

是否有理由不能使用astropy.io.fits(即from astropy.table import Table, hstack t1 = Table.read(table1) t2 = Table.read(table2) new = hstack([t1, t2]) new.write(outtable) )?

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

read

writeformat='fits'调用中,如果表名扩展名并不意味着它是FITS,则需要提供QTextEdit