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

