如何防止GCS在使用Python SDK时自动解压缩对象



我试图在GCS中下载一个经过压缩的对象,但如果没有GCS自动为我解压缩文件,我就无法下载。我希望能够自己下载gzip,然后在本地解压缩。

如果我转到GCS gui中的对象,我可以查看对象元数据并看到以下内容:

Content-Type: application/json
Content-Encoding: gzip
Cache-Control: no-transform

此外,如果我右键单击控制台中的Authenticated URL并单击Save Link As,我会得到一个gzip存档,所以我知道这个文件实际上是一个存档。

我在GCS的文件中读到,你可以设置CCD_;该对象在所有后续请求中被用作压缩对象";。

除了当我使用下面的代码下载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处理文件时返回一个错误:

Example.json.gz: not in gzip format

解决方案是使用raw_download=True下载原始gzip存档,以防止发生解压缩代码转换。

示例:

blob.download_to_filename("test.json.gz", raw_download=True)

最新更新