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

Python中如何从pickle序列化numpy数组生成的字节数组提取目标字符串

问题场景

使用pickle序列化numpy数组的实现代码:

import pickle
import numpy as np
bytes_array = pickle.dumps(np.array([1,2,3]))

代码执行后得到的字节对象如下:

b'\x04\x95\xa0\x00\x00\x00\x00\x00\x00\x00\x8c\x15numpy.core.multiarray\x94\x8c\x0c_reconstruct\x94\x93\x94\x8c\x05numpy\x94\x8c\x07ndarray\x94\x93\x94K\x00\x85\x94C\x01b\x94\x87\x94R\x94(K\x01K\x03\x85\x94h\x03\x8c\x05dtype\x94\x93\x94\x8c\x02i8\x94\x89\x88\x87\x94R\x94(K\x03\x8c\x01<\x94NNNJ\xff\xff\xff\xffJ\xff\xff\xff\xffK\x00t\x94b\x89C\x18\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x94t\x94b.'

需求为提取上述字节对象中\x04开头的转义字符串部分,尝试使用str(bytes_array)[1:]未实现预期效果。

原因说明

直接对bytes类型对象调用str()得到的结果和其repr()输出一致,是带b'...'或b"..."包裹的完整字符串。使用[1:]切片只会去掉开头的字符b,会残留开头的引号,也没有去掉结尾的引号,自然不符合预期。

可行实现方案

根据需要的输出格式,可以二选一:

  • 方案1:匹配Python默认打印bytes的显示效果
    输出和Python交互环境打印bytes时引号内的内容完全一致:可打印ASCII字符直接显示,不可打印字符用转义序列展示。代码如下:

    repr_str = repr(bytes_array)
    # 兼容单引号、双引号包裹的repr结果
    target_str = repr_str[2:-1]
    
  • 方案2:全字节统一为\xHH转义格式
    如果要求所有字节都统一使用\x加两位十六进制的格式展示,不出现直接显示的可打印字符,用遍历拼接的方式实现,输出完全规整,100%匹配\x04....的格式要求:

    target_str = ''.join(f'\\x{b:02x}' for b in bytes_array)
    

内容的提问来源于stack exchange,提问作者Newcomer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 11:48:26