如何使用 blob 文件?

Posted

技术标签:

【中文标题】如何使用 blob 文件?【英文标题】:How to consume blob file? 【发布时间】:2021-12-29 12:28:32 【问题描述】:

我遇到了问题,我正在将 xlsx 文件上传到谷歌存储。 当我想稍后重用它们时,我会获得一个 blob 文件。

之后我不知道如何使用实际的 xlsx 文件。

from google.cloud import storage

import openpyxl

client = storage.Client()
new_bucket = client.get_bucket('bucket.appspot.com')

#get blob object:
o = new_bucket.get_blob('old_version.xlsx')

# <Blob: blobstorage.appspot.com, old_version.xlsx, 16372393787851916>

#download the object

bytes_version = o.download_as_bytes()

#load it to openpyxl library
wb = load_workbook(filename = bytes_version ,data_only=True)

InvalidFileException: openpyxl does not support b'.xmlpk\x05\x06\x00\x00\x00\x00:\x00:\x00n\x10\x00\x00\xa6\x06\x01\x00\x00\x00' file format, please check you can open it with Excel first. Supported formats are: .xlsx,.xlsm,.xltx,.xltm

最终目标是将文件作为对象下载并使用 openpyxl 库读取它们(它适用于原始文件,但在云上存储后找不到获取我的 xlsx 文件的方法)。

感谢您的帮助!

编辑:添加当前代码

【问题讨论】:

任何一种方法都可以。下载对象后遇到什么问题? 能否也提供一段代码? 谷歌搜索。 Python中有很多使用这些方法的例子。您的问题中缺少的一项是您遇到了什么问题 Edit 添加了使用的代码,当前的问题是由于文件不是原始文件而是文件的 blob 或转换版本以及 openpyxl 库无法将原始文件识别为 xlsx 文件而导致的错误. 【参考方案1】:

您的代码正在将 Cloud Storage blob 读入内存:

bytes_version = o.download_as_bytes()

然后尝试从内存中加载工作簿:

wb = load_workbook(filename = bytes_version ,data_only=True)

但是,load_workbook() 方法需要文件名或类似文件的对象。 不支持对文件内容使用字节字符串

openpyxl.reader.excel.load_workbook(文件名, read_only=False, keep_vba=False, data_only=False, keep_links=True)

参数:

filename (string or a file-like object open in binary mode c.f., zipfile.ZipFile) – the path to open or a file-like object

Documentation

解决方案:

先将 Cloud Storage blob 保存到本地磁盘文件,然后在调用 load_workbook() 时指定文件名:

o.download_to_filename('/path/to/file')
wb = load_workbook(filename = '/path/to/file' ,data_only=True)

注意:将 /path/to/file 替换为系统上的真实路径和 ​​.xlsx 文件扩展名。

【讨论】:

谢谢约翰,虽然我理解了这个问题在这种情况下,有可能从内存中加载文件绝对是错误的。再次感谢!

以上是关于如何使用 blob 文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 blockblobservice 的 delete_blob 方法删除 azure 容器内的文件夹(blob)?

如何使用 C# 中的 Azure.Storage.Blobs 从 Azure 存储 Blob 以 ByteArray 格式获取文件

如何使用 Node.js 从 Supabase Storage 保存文件(将 blob 转换为文件)

如何在rails中使用carrierwave保存blob文件

如何使用 PhpMyAdmin 下载上传到 BLOB 字段的文件?

如何使用 c# 从 azure blob 存储中检索 xml 文件