如何修改Python函数实现遍历多文件夹读取Shapefile
遍历多文件夹读取Shapefile的Python函数修改方案
问题背景
原有Python函数仅支持读取单个文件夹内的Shapefile,尝试用os.walk实现多文件夹遍历时,会读取文件夹内所有格式的文件(如.cpg、.dbf等),需要调整代码实现仅读取.shp格式文件。
修改后的完整函数
import os import pandas as pd import geopandas as gpd def import_shapes_list(path_to_data: str, crs: str, current_crs: str) -> gpd.GeoDataFrame: """ 遍历指定根目录下所有子文件夹,读取所有Shapefile并合并为单个GeoDataFrame 参数: path_to_data: 根目录路径 crs: 目标坐标系 current_crs: 文件当前坐标系 返回: 合并后的GeoDataFrame """ gdfs = [] # 遍历根目录下所有子文件夹和文件 for subdir, _, files in os.walk(path_to_data): # 筛选出后缀为.shp的文件,兼容大小写格式 shp_files = [f for f in files if f.lower().endswith('.shp')] for shp_file in shp_files: file_path = os.path.join(subdir, shp_file) print(f"读取文件: {file_path}") # 读取文件并转换坐标系 gdf = gpd.read_file(file_path, crs=current_crs).to_crs(crs) # 将列名统一转为小写 gdf.columns = map(str.lower, gdf.columns) gdfs.append(gdf) # 合并所有GeoDataFrame geomap = gpd.GeoDataFrame(pd.concat(gdfs, ignore_index=True)) return geomap # 调用示例 path_to_data = './Source data/...2021/' geomap_nord = import_shapes_list(path_to_data=path_to_data, crs='EPSG:4326', current_crs='EPSG:26191')
关键修改说明
- 精准筛选.shp文件:在
os.walk的文件循环中,通过列表推导式结合lower()和endswith('.shp'),只保留Shapefile格式文件,同时兼容大写后缀的情况。 - 路径拼接优化:用
os.path.join(subdir, shp_file)拼接子目录和文件名,避免手动拼接路径出现的格式错误,适配不同操作系统。 - 参数简化调整:移除原函数的
shapes_folder参数,直接传入根目录路径即可自动遍历所有子文件夹,贴合多文件夹读取的需求。 - 坐标系转换标准化:直接使用GeoPandas原生的
read_file和to_crs完成坐标系转换,替代原函数中自定义的read_gdf(若原read_gdf有特殊逻辑,可替换回原调用方式)。
内容的提问来源于stack exchange,提问作者bravopapa
相关产品推荐
相关产品推荐

