Python循环添加列表异常:单次添加却出现列表合并问题排查
问题:向dataset中添加单个4元素列表却出现重复元素的排查与解决
你遇到的核心问题是代码缩进和数组索引逻辑错误,导致原本想每次添加一个4元素列表的操作,实际执行时出现了重复或批量添加的情况。我们一步步拆解问题并修正:
先看你原代码的核心问题点
- 缩进混乱:写入CSV、重置
dataset的代码被错误放在了**行循环(loop_water_rows)**内部,导致每遍历一个行像素就执行一次写入和重置,逻辑完全混乱。 - 数组形状与索引搞反:GDAL的
ReadAsArray()返回的数组形状是(行数, 列数),你原代码里把列和行的顺序搞反了,不仅会导致索引错误,还可能引发意外的元素累积。 - 初始化错误:
dataset= [None]会让列表一开始就有一个无效元素,后续的del dataset[0]操作也完全多余。
修正后的代码(批量写入版本)
这个版本会先把所有像素的4元素列表累积到dataset,处理完整个影像后一次性写入CSV,效率更高:
import gdal import csv # 假设以下变量已提前定义 dir_loop_water = 0 dirlist_water = [] # 你的文件路径列表 water_lenth = len(dirlist_water) dataset = [] while dir_loop_water < water_lenth: ds_water = gdal.Open('path' + dirlist_water[dir_loop_water], gdal.GA_ReadOnly) # 直接用数字判断波段数,不用转字符串 if ds_water.RasterCount == 3: print('water condition matched') # 读取三个波段的数组 band1 = ds_water.GetRasterBand(1).ReadAsArray() band2 = ds_water.GetRasterBand(2).ReadAsArray() band3 = ds_water.GetRasterBand(3).ReadAsArray() # 注意GDAL返回的是(rows, cols)顺序 rows_water, cols_water = band1.shape loop_water_cols = 0 while loop_water_cols < cols_water: loop_water_rows = 0 while loop_water_rows < rows_water: # 正确按行-列索引添加单个4元素列表 dataset.append([ band1[loop_water_rows][loop_water_cols], band2[loop_water_rows][loop_water_cols], band3[loop_water_rows][loop_water_cols], 0 ]) loop_water_rows += 1 loop_water_cols += 1 # 处理完整个影像后批量写入CSV with open('path/dataset.csv', 'a') as f: writer = csv.writer(f) writer.writerows(dataset) # 重置为空列表,准备下一个影像 dataset = [] dir_loop_water += 1
如果你想每次添加一个就立即写入(单条写入版本)
如果不需要批量累积,只想生成一个4元素列表就写一个,直接去掉dataset的维护逻辑即可:
# 在像素循环内直接写入 while loop_water_rows < rows_water: single_entry = [ band1[loop_water_rows][loop_water_cols], band2[loop_water_rows][loop_water_cols], band3[loop_water_rows][loop_water_cols], 0 ] # 立即写入单条数据 with open('path/dataset.csv', 'a') as f: writer = csv.writer(f) writer.writerow(single_entry) loop_water_rows += 1
关键修正说明
- 缩进调整:把写入和重置操作移到影像处理完成后的外层,确保逻辑块对应正确的循环范围。
- 数组索引修正:按照GDAL的行优先顺序访问像素,避免因索引颠倒导致的元素重复或错误。
- 初始化优化:用
dataset = []替代[None],去掉多余的del dataset[0]操作。
内容的提问来源于stack exchange,提问作者송준석
相关产品推荐
相关产品推荐

