python - 使用Python SDK时如何防止GCS自动解压对象?
问题描述
我正在尝试在 GCS 中下载一个压缩的对象,但是如果没有 GCS 自动为我解压缩文件,我将无法下载它。我希望能够自己下载gzip,然后在本地解压。
如果我在 GCS gui 中访问我的对象,我可以查看对象元数据并看到以下内容:
Content-Type: application/json
Content-Encoding: gzip
Cache-Control: no-transform
另外,如果我右键单击Authenticated URL
控制台中的 并单击Save Link As
,我会得到一个 gzip 存档,所以我知道这个文件实际上是一个存档。
我阅读了GCS 的文档,您可以设置 Cache-Control: no-transform
然后“该对象在所有后续请求中作为压缩对象提供”。
除非我使用下面的代码下载 GCS 对象,它是作为 JSON 对象下载的,而不是作为 gzip 存档:
bucket = storage_client.get_bucket("bucketname")
blob = bucket.blob("objectname")
stringobj = blob.download_as_text()
bytesobj = blob.download_as_bytes()
blob.download_to_filename("test.json.gz")
我尝试了三种不同的方法来下载对象,它们都将文件作为 JSON 对象下载。
只是为了验证该对象确实具有正确的标题,我运行了以下命令:
blob.reload()
print(f"Content encoding: {blob.content_encoding}")
print(f"Content type: {blob.content_type}")
print(f"Cache control: {blob.cache_control}")
>> Content encoding: gzip
>> Content type: application/json
>> Cache control: no-transform
我不确定我还能尝试什么。
解决方案
我重现了你的问题。当我下载了一个文件名具有 .gz 扩展名的 gzip 存档时,我遵循了您的输入并得到了类似的行为。但是,gunzip
-ing 文件会返回错误:
Example.json.gz: not in gzip format
解决方案是使用raw_download=True
下载原始 gzip 存档来防止发生解压转码。
例子:
blob.download_to_filename("test.json.gz", raw_download=True)
推荐阅读
- excel - 使用actxserver MATLAB在单元格中提取条件格式的公式
- java - 为什么在生产代码中使用断言框架不好?
- javascript - 使用ajax(JQuery)在html文档中填充选择
- visual-studio-code - VSCode 扩展:获取自定义大纲的功能大纲
- java - 使用 Apache POI 为 Cell 设置值时出现 NoSuchMethodError
- linux - 如何使用 sed 删除两个模式之间的所有换行符(“\n”)
- postgresql - 如何访问只能从本地 Kubernetes 集群访问的数据库?
- json - 迭代对象并打印选择值
- python - 如何在给定条件下用其他行的值填充 DataFrame 的数据?
- hive - Hive 表加入:我有一个分区表并想加入另一个表