Python 如何使用pyfits合并两个表?

Python 如何使用pyfits合并两个表?,python,astropy,pyfits,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

我正在使用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
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/home/vvikraman/anaconda2/lib/python2.7/site packages/pyfits/hdu/table.py”,第116行,在from_列中
数据=从列中拟合记录(coldefs,nrows=nrows,fill=fill)
文件“/home/vvikraman/anaconda2/lib/python2.7/site packages/pyfits/fitsrec.py”,第315行,在from_列中
如果arr.hdu.data为无:
ReferenceError:弱引用对象不再存在

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

打开文件本身的结果,
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()

您是否有不能使用
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)

read
write
调用中,如果表名扩展名不表示适合,则需要提供
format='fits'

谢谢Tom和Evert!汤姆,这个答案解决了我的问题。埃弗特,早些时候我做了这些步骤,但没有成功。这是问题的一个很好的解释,谢谢。这揭示了一个微妙的错误,我想我会尝试发布一个修复。然而,Tom Aldcroft的答案是使用更高级别的Astropy表格界面进行表格操作,这是更新代码的方法。FWIW这里有一个问题: