Обработка ошибок с использованием результата ошибки печати оператора try-кроме - PullRequest
0 голосов
/ 04 июня 2019

У меня есть программа, в которой я читаю путь к файлу и сохраняю его как переменную для последующего открытия и доступа к файлу.Имя файла может незначительно отличаться, так как оно будет либо S2A_TOA_rad_10m_atm.bsq, либо S2B_TOA_rad_10m_atm.bsq.

В настоящее время я настроил оператор try-exc, который будет отлавливать ошибку атрибута, как показанониже:

try:
    dataset_10m = str(dataset)+'S2A_TOA_rad_10m_atm.bsq'
    dataset_20m = str(dataset)+'S2A_TOA_rad_20m_atm.bsq'
    dataset_mask = str(dataset)+'S2A_TOA_rad_10m_out_hcw.bsq'
    driver,metadata,EPSG_coords,wkt_start,wkt_end = get_metadata(dataset_10m)
except AttributeError:
    dataset_10m = str(dataset)+'S2B_TOA_rad_10m_atm.bsq'
    dataset_20m = str(dataset)+'S2B_TOA_rad_20m_atm.bsq'
    dataset_mask = str(dataset)+'S2B_TOA_rad_10m_out_hcw.bsq'
    driver,metadata,EPSG_coords,wkt_start,wkt_end = get_metadata(dataset_10m)

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

ERROR 4: /*path to folder*/S2A_TOA_rad_10m_atm.bsq: No such file or directory

Это не обязательно ошибка Python, но я не смог найти какой-либо информации о том, что это сообщение об ошибке или как от него избавиться.Является ли это лучшим подходом к обработке незначительных различий имен в файле?

Может ли быть, что эта ошибка возникает позже в операторе try-exc, когда я пытаюсь открыть файл (в функции get_metadata), которыйзатем приводит к предложению об исключении?

РЕДАКТИРОВАТЬ

def get_metadata(filename):
    '''
    Runs gdalinfo on the input file and gathers the required metadata for creating the .yaml file
    '''

    metadata = gdal.Info(filename)
    metadata = metadata.split('\n')

    for line in range(len(metadata)):
        if metadata[line][0:6] == 'Driver':
            driver = metadata[line][8:12]

        if metadata[line][0:10] == 'Upper Left':
            splitline = metadata[line].split(' ')
            ul_lon_EPSG = int(splitline[5][:-5])
            ul_lat_EPSG = int(splitline[6][:-5])
        if metadata[line][0:10] == 'Lower Left':
            splitline = metadata[line].split(' ')
            ll_lon_EPSG = int(splitline[5][:-5])
            ll_lat_EPSG = int(splitline[6][:-5])
        if metadata[line][0:11] == 'Upper Right':
            splitline = metadata[line].split(' ')
            ur_lon_EPSG = int(splitline[4][:-5])
            ur_lat_EPSG = int(splitline[5][:-5])
        if metadata[line][0:11] == 'Lower Right':
            splitline = metadata[line].split(' ')
            lr_lon_EPSG = int(splitline[4][:-5])
            lr_lat_EPSG = int(splitline[5][:-5])

        if metadata[line][0:21] == 'Coordinate System is:':
            wkt_start = line+1
        if metadata[line][0:6] == 'Origin':
            wkt_end = line

    EPSG_coords = [[ll_lon_EPSG,ll_lat_EPSG],[lr_lon_EPSG,lr_lat_EPSG],[ul_lon_EPSG,ul_lat_EPSG],[ur_lon_EPSG,ur_lat_EPSG]]
    return driver,metadata,EPSG_coords,wkt_start,wkt_end

1 Ответ

0 голосов
/ 06 июня 2019

В конце я заменил оператор try / исключением на следующие четыре строки:

dataset_10m = os.path.join(dataset,glob.glob(dataset+'S2?_TOA_rad_10m_atm.bsq')[0])
dataset_20m = os.path.join(dataset,glob.glob(dataset+'S2?_TOA_rad_20m_atm.bsq')[0])
dataset_mask = os.path.join(dataset,glob.glob(dataset+'S2?_TOA_rad_10m_out_hcw.bsq')[0])
driver,metadata,EPSG_coords,wkt_start,wkt_end = get_metadata(dataset_10m)

Поскольку в каталоге всегда присутствует только один файл, начинающийся с "S2A" или "S2B"функция glob.glob с подстановочным знаком определяет, какой из них присутствует, а затем os.path.join безопасно соединяет каталог и строки файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...