Копирование данных файла соответствия и / или заголовка в новый файл соответствия - PullRequest
0 голосов
/ 26 апреля 2018

Подобный вопрос задавался ранее, но задавался неоднозначно и с использованием другого кода. Моя проблема: я хочу сделать точную копию заголовка .fits-файла в новый файл. (Мне нужно обработать файл подгонки так, чтобы я изменил данные, сохранил заголовок и сохранил результат в новом файле). Вот короткий пример кода, просто демонстрирующий инструменты, которые я использую, и несоответствие, к которому я пришел:

data_old, header_old = fits.getdata("input_file.fits", header=True)
fits.writeto('output_file.fits', data_old, header_old, overwrite=True)

Теперь я ожидаю, что файлы являются точными копиями (заголовки и данные обоих совпадают). Но если я проверю разницу, например таким образом -

fits.printdiff("input_file.fits", "output_file.fits")

Я вижу, что эти два файла не являются точными копиями друг друга. В отчете говорится:

...
Files contain different numbers of HDUs:
 a: 3
 b: 2

Primary HDU:

   Headers contain differences:
     Headers have different number of cards:
      a: 54
      b: 4
...

Extension HDU 1:

   Headers contain differences:
     Keyword GCOUNT   has different comments:
...

Почему нет точной копии? Как я могу сделать точную копию заголовка (и / или данных)? Ключ забыт? Есть ли альтернативный простой способ вставки копии заголовка файла соответствия?

1 Ответ

0 голосов
/ 28 апреля 2018

Если вы просто хотите обновить массив данных в существующем файле, сохранив остальную часть структуры, пробовали ли вы использовать функцию update?

Единственная проблема в том, что у него нет возможности записать новый файл вместо обновления существующего (возможно, у него должна быть эта опция). Однако вы все равно можете использовать его, сначала скопировав существующий файл, а затем обновив копию.

Кроме того, вы можете делать вещи более напрямую, используя объектно-ориентированный API. Что-то вроде:

with fits.open(filename) as hdu_list:
    hdu = hdu_list[<name or index of the HDU to update>]
    hdu.data = <new ndarray>
    # or hdu.data[<some index>] = <some value> i.e. just directly modify the existing array
    hdu.writeto('updated.fits')  # to write just that HDU to a new file, or
    # hdu_list.writeto('updated.fits')  # to write all HDUs, including the updated one, to a new file

В этом нет ничего не "питонического" :) 1011 *

...