Django用openpyxl读取Google Cloud Storage的xlsx文件报FileNotFoundError问题
问题根因
- 你使用的
FileSystemStorage是Django提供的本地文件系统操作工具,完全无法读取Google Cloud Storage(GCS)对象存储中的文件。你当前的代码逻辑是在服务器本地的/reportes目录下查找文件,而文件实际存放在GCS远端存储桶中,必然触发文件不存在报错。 - 路径配置不匹配:你配置的
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
相关产品推荐
相关产品推荐

