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

Django用openpyxl读取Google Cloud Storage的xlsx文件报FileNotFoundError问题

问题根因
  1. 你使用的FileSystemStorage是Django提供的本地文件系统操作工具,完全无法读取Google Cloud Storage(GCS)对象存储中的文件。你当前的代码逻辑是在服务器本地的/reportes目录下查找文件,而文件实际存放在GCS远端存储桶中,必然触发文件不存在报错。
  2. 路径配置不匹配:你配置的MEDIA_ROOT、UPLOAD_ROOT都是相对路径reportes/,但初始化FileSystemStorage时传入的是绝对路径/reportes,即使文件存放在本地,两者路径也不匹配,同样会找不到文件。
修复方案

步骤1:安装GCS适配依赖

使用Django生态的GCS存储适配包,执行安装命令:
pip install django-storages[google]

步骤2:配置Django存储后端

在项目settings.py中新增GCS存储配置,原有UPLOAD_ROOT、MEDIA_ROOT配置保持不变:

DEFAULT_FILE_STORAGE = 'storages.backends.gcloud.GoogleCloudStorage'
GS_BUCKET_NAME = '替换为你的GCS存储桶名称'
GS_PROJECT_ID = '替换为你的GCP项目ID'

记得给运行代码的服务账号配置GCS存储桶的storage.objects.get权限,否则会触发权限报错。

步骤3:修改文件读取代码

不能直接将GCS文件路径传给openpyxl,需要先把远端文件内容读取到内存中再加载,示例代码如下:

from django.core.files.storage import default_storage
import openpyxl
from io import BytesIO

# 拼接GCS存储桶内的文件相对路径
gcs_file_path = f"{UPLOAD_ROOT}ficha.xlsx"

# 从GCS读取文件内容到内存
with default_storage.open(gcs_file_path, 'rb') as gcs_file:
    file_in_memory = BytesIO(gcs_file.read())

# 加载内存中的Excel文件
plantilla_excel = openpyxl.load_workbook(file_in_memory)
print(plantilla_excel.sheetnames)
currentSheet = plantilla_excel['Hoja1']
print(currentSheet['A5'].value)
可选替代方案

如果你不想用Django的存储抽象层,可以直接使用GCP官方SDKgoogle-cloud-storage读取文件,逻辑和上述方案一致:先将远端文件内容拉取到本地内存/临时文件,再用openpyxl加载。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 11:57:06