使用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
相关产品推荐
相关产品推荐

