Python 读取 Shapefile 中文乱码怎么办?编码、驱动与字段名限制说明
问题场景:为什么同一份 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 乱码,本质是编码声明和实际编码不一致。先确认编码,再转换格式;先保护原始数据,再做批量处理。这样中文属性才不会在多轮交换中变得不可读。