You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Geopandas读取Django上传的Zip文件时触发fiona.errors.DriverError错误求助

解决方案:Geopandas读取Django上传的Zip文件报错

针对你遇到的fiona.errors.DriverError,原因是老版本的Geopandas(0.8.2)和Fiona(1.8.18)对Django的InMemoryUploadedFile这类特殊类文件对象的Zip解析支持不足,Fiona无法正确识别内存中的Zip结构。下面提供两种可行的解决办法:

方法一:用BytesIO包装上传文件内容

把上传的文件内容转成标准的BytesIO对象,让Geopandas/Fiona能正确识别Zip格式:

from io import BytesIO
import geopandas as gpd

# 获取上传的文件对象
fileobject = request.FILES['map']
# 将文件内容读取到BytesIO中
zip_buffer = BytesIO(fileobject.read())
# 读取地理数据,如果是Shapefile压缩包,可指定driver确保识别
gdf = gpd.read_file(zip_buffer, driver='ESRI Shapefile')

如果你的Zip包是其他格式(比如GeoJSON压缩包),可以去掉driver参数让Geopandas自动检测,或者对应指定正确的驱动(比如driver='GeoJSON')。

方法二:保存到临时文件再读取

老版本的Fiona对本地文件的兼容性更好,你可以先把上传的文件保存到临时文件,读取完成后再删除:

import tempfile
import geopandas as gpd
import os

fileobject = request.FILES['map']
# 创建临时Zip文件,delete=False确保用完后手动删除
with tempfile.NamedTemporaryFile(delete=False, suffix='.zip') as tmp_file:
    tmp_file.write(fileobject.read())
    tmp_file_path = tmp_file.name

try:
    # 读取临时文件中的地理数据
    gdf = gpd.read_file(tmp_file_path)
finally:
    # 读取完成后删除临时文件,避免占用磁盘空间
    os.unlink(tmp_file_path)

补充说明

  • 你的库版本比较老旧,如果后续有条件升级Geopandas到1.0+版本,对内存中压缩文件的支持会更完善,可能直接用read_file读取InMemoryUploadedFile就不会报错。
  • 如果不确定Zip包内的地理数据格式,可以先解压查看文件后缀,再对应指定driver参数,能提升识别成功率。

内容的提问来源于stack exchange,提问作者gul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 14:18:14