Geopandas循环加载年度Shapefile出现重复循环与存储异常问题
问题原因及解决办法
循环逻辑完全错误
你的代码嵌套循环顺序搞反了:
- 外层遍历每个
.shp文件,内层却重复循环1900-2014所有年份,导致每个Shapefile被无意义读取115次(2014-1900+1),这是运行时间过长的直接原因。 - 每次内层循环都会用当前读取的同一个Shapefile,覆盖字典里所有年份对应的条目,最后所有
dataXXXX键存储的自然都是最后一个被遍历到的Shapefile。
核心问题:未建立文件与年份的对应关系
你用Fiona时应该是每个年份对应一个独立的Shapefile(比如文件名包含年份标识),但现在的代码完全忽略了文件名和年份的关联,强行给每个文件绑定所有年份,彻底违背了原逻辑。
修正后的代码示例
假设你的Shapefile文件名包含年份(比如data1900.shp、data1901.shp...),可以这样修改:
import geopandas as gpd import os all_data = {} path = r'C:\Users\' files = os.listdir(path) for file in files: if file.endswith('.shp'): # 从文件名提取年份(根据你的实际文件名格式调整) # 示例:从文件名中提取连续数字作为年份 year_str = ''.join([c for c in file if c.isdigit()]) # 验证年份是否在目标范围内 if year_str and 1900 <= int(year_str) <= 2014: fname = os.path.join(path, file) shape = gpd.read_file(fname) print(f'Done {year_str}') all_data[f'data{year_str}'] = shape
如果文件名和年份的对应规则不同(比如1900_data.shp),只需要调整提取年份的逻辑即可。
修改后,每个Shapefile只会被读取一次,且对应到正确的年份键上,不会再出现重复循环和覆盖的问题。
内容的提问来源于stack exchange,提问作者SturgeonNW
相关产品推荐
相关产品推荐

