gpd.read_file()报错“File not found”或乱码,主因是Shapefile缺失配套文件(.shx、.dbf)、路径含中文/空格、编码不匹配(如需指定encoding="gbk")或.prj缺失导致CRS未识别。

Geopandas 读取 Shapefile 通常只需要 gpd.read_file(),但实际中卡住八成不是语法问题,而是路径、编码或坐标系隐含的坑。
为什么 gpd.read_file() 报错 “File not found” 或乱码?
Shapefile 实际是一组文件(.shp、.shx、.dbf 必须同目录),只传 .shp 路径也不行——read_file() 会自动找同名配套文件,但要求它们都在同一级目录下。
- 检查当前工作目录是否包含全部 shapefile 文件:
os.listdir(".") - Windows 下中文路径容易出问题,优先用绝对路径并转义或加
r""前缀:r"C:\data\boundary.shp" -
.dbf里字段名含中文时,可能因编码不匹配报 UnicodeDecodeError,可显式指定:gpd.read_file("boundary.shp", encoding="gbk")
读进来后 geometry 列是空的或类型不对?
Shapefile 的几何类型必须一致(全点、全线或全面),但有些数据导出时混了类型,或 .prj 缺失导致 Geopandas 无法识别 CRS,进而跳过 geometry 解析。
- 先确认文件是否有
.prj:没有就大概率没 CRS,后续空间操作会失败 - 用
gdf.crs检查是否为None;若为空,手动赋值:gdf = gdf.set_crs("EPSG:4326") - 如果
gdf.geometry.is_empty.all()为True,用gdf.total_bounds看是否返回(nan, nan, nan, nan)—— 这说明 geometry 根本没加载成功,回头查.shp是否损坏或被其他软件锁住
用 to_file() 保存时提示 “Driver not available” 或中文属性乱码?
默认 driver 是 "ESRI Shapefile",但它不支持 UTF-8 编码写入(.dbf 只认 Latin-1 或系统本地编码),所以中文字段一保存就变问号或报错。
立即学习“Python免费学习笔记(深入)”;
- 写入时强制指定编码:
gdf.to_file("out.shp", encoding="gbk") - 更稳妥的方式是换 driver:
gdf.to_file("out.geojson", driver="GeoJSON"),GeoJSON 原生支持 UTF-8,无编码烦恼 - 注意
to_file()不支持覆盖已有文件,目标路径存在时会直接报错,先用os.remove()或pathlib.Path(...).unlink(missing_ok=True)
CRS 处理和编码问题在不同操作系统、不同数据源之间差异极大,别依赖“一次写对”,每次读写后都该快速验证 gdf.crs、gdf.geometry.is_valid.all() 和几个关键字段的值。

















