python-3.x - 使用 try-except 语句打印错误结果的错误处理
问题描述
我有一个程序,我在其中读取文件的路径并将其保存为变量,以便以后打开和访问文件。文件名可能会略有不同,因为它将是 S2A_TOA_rad_10m_atm.bsq 或 S2B_TOA_rad_10m_atm.bsq。
目前,我已经设置了一个 try-except 语句,它将捕获属性错误,如下所示:
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)
其中变量 dataset 是包含 .bsq 文件的文件夹的路径。这段代码按我的预期工作,但是当找到以 S2B 开头的文件时会打印一条不同的错误消息(即使代码本身正确实现),我找不到摆脱它的方法:
ERROR 4: /*path to folder*/S2A_TOA_rad_10m_atm.bsq: No such file or directory
这似乎不一定是 Python 错误,但我无法找到有关此错误消息是什么或如何摆脱它的任何细节。这是处理文件中细微名称差异的最佳方法吗?
当我尝试打开文件(在 get_metadata 函数中)然后导致异常子句时,是否会在 try-except 语句中稍后发生此错误?
编辑
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
解决方案
最后,我将 try/except 语句替换为以下四行:
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 安全地将目录和文件字符串连接在一起.
推荐阅读
- arrays - 放置查询地图
将值转换为单独的变量或变量数组并打印具有空值的字段 - apache-kafka - 如何冻结主题的新版本 AVRO 模式,以便拒绝不合规的消息?
- cordova - Ionic 4 - 未处理的承诺拒绝:错误状态 404:找不到应用程序
- javascript - 如何从将每个 api 推送到数组中的函数中获取 api?
- javascript - 在反应中将javascript请求链接在一起
- c# - 无法从 Microsoft.Extensions.Logging.Abstractions 加载类型
- css - 是否有可能让这个 SCSS 在 CSS 中工作?
- apache-spark - 检查列是否包含有效数据
- sql - 如何在 MS Access 中将日期转换为具有每周分组的图表的字符串
- tcp - 18.04 只有 160 个 TCP 连接