Python实现卫星影像按传感器及场景分组的问题求助
卫星影像按传感器与场景分组解决方案
问题概述
我正在编写Python脚本处理卫星影像:读取文件夹内所有影像文件,先按传感器分类,再将同传感器的文件按场景(特定位置+时间的影像集合,每个场景含8-12个波段文件)分组。
已完成传感器分类的核心代码:
# 获取目标影像文件 sat_bands = glob(path, recursive=True) sat_bands.sort() # 按传感器分类 LC08_list = [] # ... 其他传感器的空列表初始化 for i in sat_bands: if "LC08" in i: LC08_list.append(i) # ... 其他传感器的判断逻辑
当前遇到的问题:尝试用正则表达式和for循环对LC08_list按场景分组时,结果出现大量重复的场景列表,无法得到预期的“每个场景对应一个含8个波段路径的列表”结构,添加索引变量还触发越界错误。
文件名示例(前两个为同一场景,最后一个为另一场景):
'Dados/Sat_Img\\LC08_L2SP_203033_20200819_20200904_02_T1\\LC08_L2SP_203033_20200819_20200904_02_T1_ST_B10.TIF' 'Dados/Sat_Img\\LC08_L2SP_203033_20200819_20200904_02_T1\\LC08_L2SP_203033_20200819_20200904_02_T1_SR_B3.TIF' 'Dados/Sat_Img\\LC08_L2SP_203033_20201123_20210315_02_T1\\LC08_L2SP_203033_20201123_20210315_02_T1_SR_B7.TIF'
可行解决方案
方案1:利用目录结构分组(最可靠)
同一场景的所有波段文件都存放在同一个子目录下,直接提取文件所在目录作为分组依据:
import os from collections import defaultdict # 初始化分组字典 scene_groups = defaultdict(list) for file_path in LC08_list: # 获取文件所属的场景目录 scene_dir = os.path.dirname(file_path) scene_groups[scene_dir].append(file_path) # 转换为预期的列表格式:每个元素是一个场景的所有波段路径 LC08_scenes = list(scene_groups.values())
方案2:正则提取场景ID分组
从文件名中提取场景唯一标识(波段后缀_ST_Bxx/_SR_Bxx之前的部分),以此分组:
import re from collections import defaultdict scene_groups = defaultdict(list) # 正则匹配场景ID:捕获到_ST或_SR之前的字符串 scene_pattern = re.compile(r'(.*?)_[ST]R_') for file_path in LC08_list: match_result = scene_pattern.search(file_path) if match_result: scene_id = match_result.group(1) scene_groups[scene_id].append(file_path) LC08_scenes = list(scene_groups.values())
方案3:优化手动循环分组
若坚持用基础for循环,先提取所有唯一场景ID,再逐个匹配文件:
import re # 第一步:提取所有唯一的场景ID scene_pattern = re.compile(r'(.*?)_[ST]R_') unique_scene_ids = set() for file_path in LC08_list: match_result = scene_pattern.search(file_path) if match_result: unique_scene_ids.add(match_result.group(1)) # 第二步:按场景ID分组 LC08_scenes = [] for scene_id in unique_scene_ids: current_scene_files = [f for f in LC08_list if scene_id in f] LC08_scenes.append(current_scene_files)
关键说明
- 方案1利用目录天然的场景划分,无需正则,代码简洁且不易出错,优先推荐。
- 避免手动索引循环的核心原因是:手动维护索引容易出现越界、重复添加等问题,用字典/集合自动处理分组逻辑更高效可靠。
内容的提问来源于stack exchange,提问作者Marcelo Silva
相关产品推荐
相关产品推荐

