解决ENVI无法打开Landsat8/9 C2L2数据的问题:Python脚本实现 解决ENVI无法打开Landsat8/9 C2L2数据的问题Python脚本实现常见问题问题及参考博客问题现象解决方案手动解决方法Python脚本实现批量处理常见问题问题及参考博客在处理从USGS网站下载的Landsat8/9 C2 L2数据时常常会遇到将MTL.txt 文件直接拉入ENVI或直接打开Metadata数据文件时提示错误的情况。对于该问题的常见问题及解决方案可以参考文章https://blog.csdn.net/zbh13859825167/article/details/139309431。问题现象当尝试将从USGS网站下载的Landsat8/9 C2 L2数据的MTL.txt 文件直接导入ENVI或者直接打开Metadata数据文件时会出现如下错误提示解决方案手动解决方法Landsat8数据对于Landsat8数据可通过修改下载的MTL.txt 文件来解决问题。具体步骤如下将文件第一行的GROUP LANDSAT_METADATA_FILE修改为GROUP L1_METADATA_FILE。删除文件中第183行GROUP LEVEL1_PROCESSING_RECORD与第227行END_GROUP LEVEL1_PROCESSING_RECORD之间的内容Landsat 9具体行号位置可能有变化也在183行附近注意这几个名称就行。 。完成上述修改后即可在ENVI中直接打开该数据文件。Landsat9数据Landsat9数据的处理在Landsat8数据处理的基础上还需要额外增加一步将文件第53行的SPACECRAFT_ID LANDSAT_9改为SPACECRAFT_ID LANDSAT_8。完成这些修改后也可以在ENVI中直接打开数据文件。Python脚本实现批量处理为了更高效地处理多个数据文件我们可以使用Python编写一个脚本实现批量处理。以下是具体的脚本设计原理、思路及代码脚本设计原理与思路脚本会遍历指定文件夹及其子文件夹中的所有MTL.txt 文件对每个文件按照上述手动处理的规则进行修改。具体来说脚本会完成以下操作将文件第一行的GROUP LANDSAT_METADATA_FILE替换为GROUP L1_METADATA_FILE。检查文件第53行如果包含SPACECRAFT_ID LANDSAT_9则将其替换为SPACECRAFT_ID LANDSAT_8。删除文件中第183 - 227行Python索引从0开始对应索引为182 - 226的内容。脚本代码importosdefprocess_mtl_files(root_folder):forroot,dirs,filesinos.walk(root_folder):forfileinfiles:iffile.endswith(MTL.txt):file_pathos.path.join(root,file)try:withopen(file_path,r,encodingutf-8)asf:linesf.readlines()print(f正在处理文件{file_path})iflen(lines)0:lines[0]lines[0].replace(GROUP LANDSAT_METADATA_FILE,GROUP L1_METADATA_FILE)land_indexlines[53].rfind(9)ifland_index!-1:lines[53]lines[53].replace( SPACECRAFT_ID \LANDSAT_9\, SPACECRAFT_ID \LANDSAT_8\)iflen(lines)227:#判断是否删除过183行到227行之间内容iflines[182].rfind(GROUP LEVEL1_PROCESSING_RECORD)!-1:dellines[182:227]# 182对应第183行226对应第227行else:print(f文件{file}行数不足无法删除指定行)# 写入修改后的内容withopen(file_path,w,encodingutf-8)asf:f.writelines(lines)print(f成功处理文件{file_path})exceptExceptionase:print(f处理文件{file_path}时出错{str(e)})else:print(f{root_folder}文件夹下没有可处理的文件)if__name____main__:target_folderrC:/Users/79877/Downloads/EdgeDownload/test# 替换为实际文件所在文件夹路径process_mtl_files(target_folder)