我正在使用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
答案 0 :(得分:3)
这有点令人困惑,我对这个原因并不是百分之百确定,但我的猜测是这样的:
打开文件本身的结果pyfits.open(...)
,并未分配给任何内容,因为您可以立即访问第二个HDU的列。这给你一个弱参考:基本上,实际数据不再可用,因为在某种意义上(并且可能是真实的,我没有被检查)文件被关闭。
Pyfits这样做是为了节省内存。
令人困惑的部分是,在您分配了t1
和t2
之后,您仍然可以打印其定义,因此看起来实际的列就在附近。实际上,它仍然存在列定义:无法检索实际数据。因此,当您尝试从组合t1
和t2
创建新的二进制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
在write
和format='fits'
调用中,如果表名扩展名并不意味着它是FITS,则需要提供QTextEdit
。