You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 15:52:26