我该怎么做才能使我的程序不为.fits文件中不存在的头抛出KeyError?

2024-09-27 09:32:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在制作一个程序,在计算机中搜索.fts和.fits文件,在其中打开文件并检索与头中特定关键字对应的信息,并将文件重命名为该关键字。在

我有一个问题,我一直收到一个KeyError,因为在文件中找不到我要搜索的头关键字。有办法吗?我想能够搜索各种关键字,并做一些事情,即使关键字不存在于文件中。在

代码如下:

from astropy.io import fits
import os

for i in os.listdir(os.getcwd()):
if i.endswith(".fits") or i.endswith(".fts"): 

    hdulist = fits.open(i)

    DATEOBS_header = hdulist[0].header['DATE-OBS'] 
    EXPTIME_header = int(round(hdulist[0].header['EXPTIME']))
    CCDTEMP_header = int(round(hdulist[0].header['CCD-TEMP']))
    XBINNING_header = hdulist[0].header['XBINNING']
    FILTER_header = hdulist[0].header['FILTER']
    IMAGETYP_header = hdulist[0].header['IMAGETYP']
    OBJECT_header = hdulist[0].header['OBJECT']

    DATEandTIME = DATEOBS_header[0:]
    YEAR = DATEandTIME[0:4]
    MONTH = DATEandTIME[5:7]
    DAY = DATEandTIME[8:10]

    #TIME = DATEOBS_header[11:] 
    HOUR = DATEandTIME[11:13]
    MINUTE = DATEandTIME[14:16]
    SECONDS = DATEandTIME[17:]

    DATE = str(YEAR) + str(MONTH) + str(DAY) + 'at' + str(HOUR) + str(MINUTE) + str(SECONDS) 

    if IMAGETYP_header == 'Light Frame':
        newname = str(OBJECT_header) + '_' + str(DATE) + '_' + str(CCDTEMP_header) + 'temp_' + str(XBINNING_header) + 'bin_' + str(EXPTIME_header) + 'exptime_' + str(FILTER_header) + '.fits'

    if IMAGETYP_header == 'Dark Frame':
        newname = 'Dark_' + str(DATE) + 'at' + str(TIME) + '_' + str(CCDTEMP_header) + 'temp_' + str(XBINNING_header) + 'bin_' + str(EXPTIME_header) + 'exptime' + '.fits'

    if IMAGETYP_header == 'Flat Field':
        newname = 'Flat_' + str(DATE) + 'at' + str(TIME) + '_' + str(CCDTEMP_header) + 'temp_' + str(XBINNING_header) + 'bin_' + str(EXPTIME_header) + 'exptime_' + str(FILTER_header) + '.fits'

    prevname = i
    os.rename(prevname, newname)

    hdulist.close()

    continue
else:
    continue

这是我得到的错误:

^{pr2}$

Tags: 文件dateifos关键字filterheaderfits
2条回答

{{cd2>假设你能

DATEOBS_header = hdulist[0].header.get('DATE-OBS')

如果键'DATE-OBS'不存在,则返回None。在

有关详细信息,请参见https://docs.python.org/2/library/stdtypes.html#dict.get。在

要防止这类异常停止您的程序,您可以捕捉它们,如下所示:

try:
    DATEOBS_header = hdulist[0].header['DATE-OBS']
except KeyError:
    DATEOBS_header = None

或者,使用dictionaries的.get()方法,该方法检查键是否存在以及是否不返回默认值,而不是引发异常。返回的默认值是None。在

如果您这样做,您还需要设置一些合理的默认值,或者捕捉正在转换值的情况(因为您无法转换None)。在

最后,每当您从文件中读取数据时,您应该始终假定数据格式错误/垃圾,并进行一些防御性编程。在您的代码中,假设为CCDTEMP返回的值是一个数字,但是如果文件已损坏或有一个空白怎么办?你的应用程序不能处理这个案子。在

下面是一些试图捕获尽可能多的错误的代码:

^{pr2}$

相关问题 更多 >

    热门问题