You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python解析Firestore中Gzip压缩Blob数据的问题

解决Python处理Firestore中Gzip压缩Blob数据的编码问题

问题核心

Firestore中存储的Gzip压缩Blob数据,在TypeScript中通过Pako.ungzip+Base64解码可正常解析,但Python中常因字符串与字节对象混淆触发ValueError或TypeError,本质是没有匹配TypeScript的解码流程,同时错误处理了Firestore Blob的类型转换。


有效处理方案

场景1:直接从Firestore获取Blob对象

Firestore的Blob对象本身是字节容器,无需转成字符串,直接提取字节后解压即可:

import gzip
import json
from google.cloud import firestore

# 初始化Firestore客户端
db = firestore.Client()
# 获取目标文档
doc = db.collection("your_collection").document("target_doc").get()
# 提取Blob字段
compressed_blob = doc.to_dict().get("compressed_data_field")

# 关键:直接将Blob转为原始字节,不做字符串转换
compressed_bytes = compressed_blob.tobytes()
# Gzip解压
uncompressed_bytes = gzip.decompress(compressed_bytes)
# 若原始数据为JSON文本,解码为字典
original_data = json.loads(uncompressed_bytes.decode("utf-8"))

场景2:已获取Base64编码的字符串形式数据

如果数据被错误存储为Base64编码字符串(或从前端接收的是该格式),需先将字符串转字节,再Base64解码、解压:

import gzip
import base64
import json

# 假设base64_str是从Firestore拿到的Base64编码字符串
base64_str = "H4sIAAAAAAAA/..."

# 第一步:字符串转字节,再Base64解码为压缩字节
compressed_bytes = base64.b64decode(base64_str.encode("utf-8"))
# 第二步:Gzip解压
uncompressed_bytes = gzip.decompress(compressed_bytes)
# 解码为原始文本/JSON
original_data = json.loads(uncompressed_bytes.decode("utf-8"))

常见错误原因解析

  • ValueError: non-ASCII character:错误将Blob转为字符串(如str(blob)),字符串中包含字节的非ASCII字符表示,导致Base64解码失败。解决:直接用blob.tobytes()提取原始字节。
  • TypeError: a bytes-like object is required, not 'str':尝试用gzip.decompress解压字符串,而gzip仅接受字节对象。解决:确保输入gzip.decompress的是bytes类型数据。

内容的提问来源于stack exchange,提问作者pb-0

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 03:59:59