Python 读取 Shapefile 中文乱码怎么办?编码、驱动与字段名限制说明

Python
Dr.GIS
wowwwai GIS研习社 · 工具流程与项目排障

问题场景:为什么同一份 Shapefile 有的软件正常,有的软件乱码

Shapefile 中文乱码是 GIS 数据处理中非常常见的问题。你可能在 ArcGIS 里打开正常,用 GeoPandas 读取却变成乱码;或者 QGIS 正常显示,导出后别人再打开又乱了。原因通常不在 Python,而在 Shapefile 的编码信息不完整或不一致。

Shapefile 是一组文件,不是单文件格式。属性表在 .dbf 中,编码可能由 .cpg 文件声明。如果 .cpg 缺失,不同软件会按默认编码猜测。国内历史数据常见 GBK、GB18030,也有 UTF-8,猜错就会乱码。

先理解 Shapefile 的编码来源

文件 作用 与乱码关系
.dbf 保存属性表 中文字段值存储在这里
.cpg 声明编码 缺失时容易被软件猜错
.shp 保存几何 通常不影响中文乱码

GeoPandas 读取时指定编码

import geopandas as gpd

gdf = gpd.read_file("data.shp", encoding="gbk")
print(gdf.head())

gdf.to_file("data_utf8.shp", encoding="utf-8")

如果 gbk 不正确,可以尝试 gb18030 或 utf-8。读入后不要急着批量导出,先检查关键字段的中文是否正常。

字段名限制也要注意

Shapefile 字段名最多 10 个字符,长字段名会被截断,中文字段名也可能在跨软件时出问题。正式项目中,建议字段名使用短英文或拼音,中文含义写在字段说明表里。

什么时候应该换格式

如果数据需要保存长字段名、中文字段、复杂类型或多个图层,GeoPackage 通常比 Shapefile 更合适。它是单文件容器,编码更稳定,也被 QGIS、ArcGIS Pro 和 GeoPandas 支持。

项目避坑:不要覆盖原始乱码文件

乱码处理最怕“试错式覆盖”。每次转换前先备份原始数据,确认编码正确后再导出新文件。

一旦错误编码被重新写入,后续恢复会更困难。正确流程应该是读取测试、确认编码、另存标准格式。

FAQ

为什么加了 encoding 还是乱码?

可能编码猜错了,尝试 gb18030、gbk、utf-8;也可能原文件已经被错误编码覆盖。

cpg 文件可以手动创建吗?

可以,但前提是你确认 dbf 的真实编码。只写 cpg 不会自动转换已有内容。

GeoPackage 能避免乱码吗?

通常更稳定,但前提是从 Shapefile 读取时已经使用正确编码。

总结

Python 读取 Shapefile 乱码,本质是编码声明和实际编码不一致。先确认编码,再转换格式;先保护原始数据,再做批量处理。这样中文属性才不会在多轮交换中变得不可读。