使用glob与通配符打开shp文件时gpd.read_file读取失败如何解决
问题原因
glob()函数的返回值是所有匹配到的文件路径组成的列表,哪怕只匹配到1个文件,返回的也是长度为1的列表,而非单个路径字符串。geopandas.read_file()不支持直接传入路径列表作为参数,直接传会触发参数类型错误。- 手动字符串拼接路径的写法容错性差,很容易出现斜杠重复、路径拼写错误的问题;如果目标目录不存在、当前运行用户无目录访问权限、通配符规则和实际文件名不匹配,
glob()会直接返回空列表,传入空值读取也会触发报错。 - 若通配符匹配到了多个符合规则的shp文件,直接读取单个文件的逻辑本身也不符合批量处理的需求,会出现读错文件的问题。
修正方案
根据实际需求选对应实现即可,所有写法都加了前置校验,避免无意义的报错:
场景1:通配符仅匹配单个目标shp文件
如果你确认目录下同一时间只会有一个符合extent_*.shp规则的文件,取匹配列表的第一个元素传入即可,路径拼接改用标准库方法避免格式错误:
from glob import glob import geopandas as gpd import os # 规范拼接路径,自动处理斜杠问题 search_pattern = os.path.join('/Users/extents', 'extent_*.shp') matched_files = glob(search_pattern) # 异常校验 if len(matched_files) == 0: raise FileNotFoundError("未找到符合extent_*.shp规则的文件,请检查目录路径、访问权限以及文件名格式") if len(matched_files) > 1: raise ValueError(f"匹配到多个符合规则的shp文件:{matched_files},请缩小通配符范围明确目标文件") extent = gpd.read_file(matched_files[0])
场景2:需要读取所有匹配到的shp文件合并
如果后续新增文件后需要把所有符合命名规则的shp都读入合并为一个GeoDataFrame,遍历匹配列表逐个读取后拼接即可:
from glob import glob import geopandas as gpd import os import pandas as pd search_pattern = os.path.join('/Users/extents', 'extent_*.shp') matched_files = glob(search_pattern) if not matched_files: raise FileNotFoundError("未找到任何符合extent_*.shp规则的文件") # 逐个读取后合并 gdf_collect = [] for shp_path in matched_files: gdf_collect.append(gpd.read_file(shp_path)) extent = gpd.GeoDataFrame(pd.concat(gdf_collect, ignore_index=True))
额外排查点
如果运行后还是提示找不到文件,逐一核对以下项:
- 确认
/Users/extents目录路径拼写正确,当前运行Python的账号有该目录的读取权限 - 注意glob在Linux、macOS系统下是大小写敏感的,确认文件名后缀是
.shp而非.SHP,前缀是extent_而非Extent_等其他大小写形式 - 确认shp文件的完整性:shp格式依赖.shx、.dbf等同名附属文件,缺文件也会导致读取失败
内容的提问来源于stack exchange,提问作者Humzah Qazilbash
相关产品推荐
相关产品推荐

