我正在编写一个处理天文FITS文件的程序包。我想允许文件位于本地或云中。对于本地文件,我可以fits.getdata()
或fits.open()
任意多次,但对于远程文件,必须先关闭文件,然后才能再次打开它。
这是问题的说明性示例:
>>> file
<S3Boto3StorageFile: filename.fits.fz>
>>> from astropy.io import fits
>>> hdul = fits.open(file)
>>> hdul.info()
Filename: filename.fits.fz
No. Name Ver Type Cards Dimensions Format
0 PRIMARY 1 PrimaryHDU 8 ()
1 SCI 1 CompImageHDU 268 (3054, 2042) float32
2 CAT 1 BinTableHDU 157 259R x 37C [D, D, D, D, K, K, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, K, D, D]
3 BPM 1 CompImageHDU 10 (3054, 2042) uint8
>>> fits.getdata(file,header=True)
OSError: Empty or corrupt FITS file
>>> file.close()
>>> hdul = fits.open(file)
>>> hdul.info()
Filename: filename.fits.fz
No. Name Ver Type Cards Dimensions Format
0 PRIMARY 1 PrimaryHDU 8 ()
1 SCI 1 CompImageHDU 268 (3054, 2042) float32
2 CAT 1 BinTableHDU 157 259R x 37C [D, D, D, D, K, K, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, K, D, D]
3 BPM 1 CompImageHDU 10 (3054, 2042) uint8
对于远程文件,我需要先执行file.close()
,然后才能再次打开它,而对于本地文件,则不需要。
当前,我必须检查输入file
是否类似于文件(因此我将其关闭)或Path或str
(当我不关闭它时)。必须执行此检查感觉有点麻烦。
如果这是预期的行为,我想知道为什么它对于本地和远程文件(甚至是类似文件的对象和非对象)不同。