Colab重启后读取含GeoDataFrame的pkl文件报KeyError:0错误
GeoDataFrame Pickle文件读取KeyError:0异常排查
问题复现
重启Colab运行环境后,读取此前可正常加载的GeoDataFrame pickle文件时抛出异常,复现代码:
test = 'derived edges.pkl' testdf = pd.read_pickle(test)
完整报错栈:
--------------------------------------------------------------------------- KeyError Traceback (most recent call last) <ipython-input-13-eb97f2da93db> in <module>() 1 test = 'derived edges.pkl' ----> 2 testdf = pd.read_pickle(test) 1 frames /usr/local/lib/python3.7/dist-packages/pandas/io/pickle.py in read_pickle(filepath_or_buffer, compression, storage_options) 215 # RawIOBase, BufferedIOBase, TextIOBase, TextIOWrapper, mmap]"; 216 # expected "IO[bytes]" --> 217 return pickle.load(handles.handle) # type: ignore[arg-type] 218 except excs_to_catch: 219 # e.g. /usr/local/lib/python3.7/dist-packages/geopandas/array.py in __setstate__(self, state) 422 def __setstate__(self, state): 423 if compat.USE_PYGEOS: --> 424 geoms = pygeos.from_wkb(state[0]) 425 self._crs = state[1] 426 self._sindex = None # pygeos.STRtree could not be pickled yet KeyError: 0
报错触发于geopandas数组反序列化流程,代码注释标注pygeos.STRtree could not be pickled yet,最终抛出KeyError: 0异常。
根因分析
该问题由GeoPandas序列化/反序列化时的PyGEOS后端配置不匹配导致:
- 之前写入pickle文件的Colab环境中,GeoPandas未启用PyGEOS后端,序列化生成的状态结构和PyGEOS开启时的结构不一致
- 重启后的新Colab环境默认开启
USE_PYGEOS配置,反序列化时会按照PyGEOS的格式规则,尝试从状态字典中按索引读取WKB几何、CRS信息,找不到对应索引项就抛出KeyError
解决方案
- 临时读取方案:读取文件前手动关闭PyGEOS后端,和写入时的配置保持一致即可正常加载:
import geopandas # 先关闭PyGEOS再读文件 geopandas.options.use_pygeos = False import pandas as pd test = 'derived edges.pkl' testdf = pd.read_pickle(test)
- 长期适配方案:如果后续需要在开启PyGEOS的环境下使用该文件,可先按上述方法加载文件后,开启PyGEOS配置重新存储pickle,后续读取就不会出现配置不匹配问题
- 存储建议:跨环境、跨版本传递GeoDataFrame时,尽量避免使用pickle做长期存储,优先选择GeoParquet等通用格式,减少后端、版本差异带来的兼容性问题
内容的提问来源于stack exchange,提问作者Thipak B
相关产品推荐
相关产品推荐

