如何读取Google Storage中的xlsx格式blob文件并使用openpyxl加载?
问题原因
你出现报错的核心原因是openpyxl.load_workbook的filename参数不支持直接传入字节类型数据,你将GCS下载得到的字节流直接传给该参数时,openpyxl会将其作为文件名路径解析,自然无法识别为xlsx格式。
解决方法
你只需要用Python标准库io中的BytesIO将下载得到的字节流包装为类文件对象,再传给load_workbook即可正常读取,完整可运行代码如下:
from google.cloud import storage from openpyxl import load_workbook from io import BytesIO client = storage.Client() new_bucket = client.get_bucket('bucket.appspot.com') # 获取blob对象 o = new_bucket.get_blob('old_version.xlsx') # 下载为字节 bytes_version = o.download_as_bytes() # 包装为类文件对象后传入openpyxl wb = load_workbook(filename=BytesIO(bytes_version), data_only=True)
可选排查方案
如果修改代码后仍然报错,可按以下顺序排查:
- 打印
o.size属性,对比该值和本地原始xlsx文件的大小是否一致,确认文件上传到GCS的过程中没有出现损坏、漏传的问题 - 可先将下载的字节流写入本地测试文件,确认文件本身可正常用Excel打开:
with open('local_test.xlsx', 'wb') as f: f.write(bytes_version)
- 检查上传文件到GCS的逻辑,确认是按二进制方式读取本地xlsx文件后上传,避免上传过程中对文件内容做了编码转换导致损坏
内容的提问来源于stack exchange,提问作者Tony
相关产品推荐
相关产品推荐

