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
相关产品推荐
相关产品推荐

