2015-11-22 10 views
2

Я использую Python 2.7.10 и pyfits 3.3. Раньше я использовал следующий код для объединения двух таблиц. Тем не менее, теперь я получаю некоторые ошибкиКак слить два стола с pyfits?

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 

ответ

3

Есть причина, вы не можете использовать 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', если расширение (s) имя таблицы не означает, что это FITS.

3

Это немного сбивает с толку, и я не на 100% уверен, что причина, но вот мое предположение:

Результат открытия самого файла pyfits.open(...) не присваивается никому, поскольку вы сразу получаете доступ к столбцам второго HDU. Это дает вам небольшую ссылку: по существу, фактические данные больше недоступны, потому что файл в некотором смысле (и, возможно, реальный, я не проверял) закрыт.
Pyfits делает это, чтобы сохранить память.

Сложная часть состоит в том, что после того, как вы назначили t1 и t2, вы все равно можете распечатать свое определение, так что кажется, что фактические столбцы находятся вокруг. Фактически, это определения столбцов, которые все еще существуют: фактические данные не могут быть восстановлены. Следовательно, когда вы пытались создать новый двоичный HDU из комбинации t1 и 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() 
+0

Спасибо Том и Эверт! Том, этот ответ решает мою проблему. Эверт, раньше я делал эти шаги, но не работал. – vinu

+0

Это хорошее объяснение проблемы, спасибо. Это выявило тонкую ошибку, которая, я думаю, попытаюсь опубликовать исправление. Тем не менее, ответ Тома Олдкрофта на использование интерфейса Astropy Table более высокого уровня для манипулирования таблицами - это способ перехода на новый код. – Iguananaut

+0

FWIW есть проблема, открытая для этого здесь: https://github.com/astropy/astropy/issues/4345#issuecomment-180957070 – Iguananaut

 Смежные вопросы

  • Нет связанных вопросов^_^