Python中如何解压PostgreSQL数据库中的压缩字符串?
解决思路
核心问题
你拿到的\\x0a78...字符串是PostgreSQL输出的十六进制转义格式的二进制数据,不是普通文本字符串,直接用UTF16编码会破坏原始压缩字节结构,导致zlib无法识别正确的压缩头。
正确处理步骤
- 剥离字符串开头的转义前缀
\\x - 将剩余的十六进制字符串解码为原始二进制字节
- 用
zlib.decompress()解压字节数据
代码示例
import zlib import json # 从DataFrame获取counter列的字符串 counter_str = sample.iloc[1]['counter'] # 剥离开头的\\x前缀,提取纯十六进制部分 hex_data = counter_str.replace('\\x', '') # 将十六进制字符串转换为二进制字节 compressed_bytes = bytes.fromhex(hex_data) # 尝试解压 try: decompressed_data = zlib.decompress(compressed_bytes) # 转换为JSON(因为你提到是类JSON数据) json_result = json.loads(decompressed_data) print(json_result) except zlib.error as e: # 如果报错,检查是否有多余前缀(比如开头的0a是无关字符) # 尝试从zlib标准头0x78开始截取(0x78是zlib压缩数据的标志性开头) start_idx = compressed_bytes.find(b'\x78') if start_idx != -1: decompressed_data = zlib.decompress(compressed_bytes[start_idx:]) json_result = json.loads(decompressed_data) print(json_result) else: print(f"解压失败: {e}")
为什么之前的方法无效
你用bytes(sample.iloc[1]['counter'], 'UTF16')是把十六进制字符串当成UTF16文本编码成字节,这完全改变了原始压缩数据的二进制结构,zlib自然无法识别正确的压缩头(报错incorrect header check就是因为头字节不对)。
内容的提问来源于stack exchange,提问作者bAN
相关产品推荐
相关产品推荐

