3

私はPython 2.7.10とpyfits 3.3を使用しています。前に、次のコードを使用して 2 つのテーブルをマージしました。ただし、現在、いくつかのエラーが発生しています

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

3

少しややこしいので、原因については 100% 確信が持てませんが、次のように推測しています。

2 番目の HDU の列にすぐにアクセスするため、ファイル自体を開いた結果 はpyfits.open(...)何にも割り当てられません。これは弱い参照を提供します。基本的に、実際のデータはもう利用できません。ファイルがある意味で (そしておそらく本物で、私は確認していませんが) 閉じられているためです。
Pyfits はメモリを節約するためにこれを行います。

t1紛らわしいのは、とを割り当てた後でも、t2それらの定義を印刷できるため、実際の列が周りにあるように見えることです。実際、まだ残っているのは列の定義です。実際のデータを取得することはできません。したがって、実際のデータが必要なt1との組み合わせから新しいバイナリ HDU を作成しようとすると、失敗します。t2

解決策は、データへの適切な参照を維持することです。これを行うには複数の方法があるかもしれません。これは私のために働くようです:

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 に答える