2015-01-26 3 views
1

Так что у меня сжатый файл, который универсальное я прочитал, как так:Открыть приспосабливает файл BZ2

File = bz2.BZ2File(fname) 
fits = File.read() 

Я использую astropy.io.fits читать FITS файлы. На данный момент я получаю файлы .fits.bz2 от api, поэтому мне идеально хотелось бы их читать, как hdulist = fits.open(fit)

Но он просто подбрасывает TypeError: must be encoded string without NULL bytes, not str. (Я проверял, что файл хорош, распаковывая его вручную и читая его, как описано выше).

Я думаю, мой вопрос является общим: как передать открытый файл другой функции?

+0

Похоже, вы пытаетесь передать строку, содержащую байты файла, в 'fits.open', что не является правильным использованием. Кроме того, при публикации сообщений об исключениях из Python вы должны опубликовать полную трассировку, а не только сообщение об исключении. «Как передать открытый файл другой функции?» Как и любая другая переменная. Все, что имеет значение, состоит в том, что рассматриваемая функция делает что-то полезное с файловым объектом. – Iguananaut

ответ

3

С documentation для astropy вы можете обнаружить, что:

astropy.io.fits.open принимает имя файла, открытый файл или файл-подобный объект, как это первый аргумент

Вы пытаетесь передать содержимое из файла в astropy, а не файл file.

Чтобы получить ваш пример для работы, вам нужно просто передать объект файла, возвращенный bz2, в астропию, которая будет обрабатывать его как несжатый файл.

from astropy.io import fits 
import bz2 

decompressed_file = bz2.BZ2File("example.fits.bz2") 
hdulist = fits.open(decompressed_file) 
+0

См. Также эту проблему, которую я только что открыл, так как кажется странным, что io.fits не поддерживает сжатие в дескрипторах файлов, например, для файлов: https://github.com/astropy/astropy/issues/5948 – uayebforever

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