如何在astropy中从URL打开一个FITS文件?

3

我有一个.fits文件的URL,希望能够像在本地一样读入Python。我尝试过以下方式:

import urllib2 as url, astropy.io.fits as fits
target_url = 'https://s3.amazonaws.com/bdnyc/spex_prism_U50171_0835%2B19_chiu06.fits'
obj = url.urlopen(target_url)
dat = fits.open(obj)

但是我得到了一个IOError错误:文件对象没有“write”方法,需要模式“ostream”。
即使我在fits.open()中设置了mode='readonly',它也说无法向文件对象写入。
有没有一种方法可以从URL打开.fits文件?或者将urlopen()返回的.fits文件字节转换回HDUList?

笑面人在下面给出了正确的答案--您可以直接将URL传递到fits.open()中。尽管我认为应该支持传递一个urlopen对象,但从未得到支持。如果没有别的原因,那么您收到的错误信息是具有误导性的。我已经为此开了一个问题:https://github.com/astropy/astropy/issues/4165 - Iguananaut
1个回答

2
根据Astropy.io.fits.open文档,它有一个选项可以从URL读取.fits文件的内容:

cache : bool, optional

如果文件名是URL,则使用download_file打开文件。这指定是否将文件保存在Astropy的下载缓存中(默认值:True)。

这意味着您不必使用urllib2。 您只需直接将target_url提供给fits.open,因为它在打开之前调用astropy.utils.data.download_file。请参见下面的代码。
In [1]: import astropy.io.fits as fits

In [2]: target_url = 'https://s3.amazonaws.com/bdnyc/spex_prism_U50171_0835%2B19_chiu06.fits'

In [3]: dat = fits.open(target_url)

In [4]: dat
Out[4]: [<astropy.io.fits.hdu.image.PrimaryHDU at 0x219a9e8>]

fits.open将打开URL,无论缓存是否启用。如果cache==True,则已下载数据的副本将保存在磁盘上,然后将使用缓存版本尝试下载相同的文件。 - keflavich
我并没有说打开URL需要缓存。相反,在文档中,它说一个URL可以被提供给fits.open。我只是想指出这种方法确实可以打开一个URL,这是OP不知道的。 - WGS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接