使用GeoDataFrame导出Shapefile时出现latin-1编码UnicodeEncodeError
问题原因
该报错本质是Shapefile格式的文本存储默认适配latin-1单字节编码,这种编码仅支持0-255范围内的字符,无法编码数据中出现的en dash(长破折号\u2013)类超范围Unicode字符。报错提示的position 14是超范围字符在待编码文本中的位置,一般是字段名、字段值的文本内容触发了编码限制。
可落地的解决方案
- 导出时显式指定UTF-8编码(优先推荐方案)
Geopandas底层依赖的fiona库支持在Shapefile中写入UTF-8编码标记,不需要修改原始数据即可解决编码兼容问题,将原有导出代码修改为:gdb.to_file(pth_info + 'Barrio_Dptos.shp', encoding='utf-8')
该方式导出的文件可被QGIS、新版ArcGIS等主流GIS软件正常识别,无乱码问题。 - 批量替换数据中的特殊字符(适配老旧软件场景)
如果需要兼容不支持UTF-8编码标记的老旧GIS软件,可以在导出前遍历所有列名、字符串类型字段,将非latin-1支持的特殊字符替换为同表意的ASCII字符,示例代码:
可根据实际遇到的其他特殊字符(如智能引号# 替换列名中的特殊字符 gdb.columns = gdb.columns.str.replace('\u2013', '-', regex=False) # 替换所有字符串字段值中的特殊字符 for col in gdb.select_dtypes(include=['object']).columns: gdb[col] = gdb[col].str.replace('\u2013', '-', regex=False)“”、长破折号\u2014等)追加对应的替换规则。
内容的提问来源于stack exchange,提问作者Agustín Jornet
相关产品推荐
相关产品推荐

