解码字节时移除转义是否正确?及相关代码作用解析
问题解答
一、UnicodeDecodeError错误处理及修改建议
你想把b'\x86'改成b'x86'的做法完全不正确,因为这会彻底改变原始数据的含义:
b'\x86'是单个十六进制字节(对应十进制134),属于原始业务数据的一部分;b'x86'是三个ASCII字符('x'、'8'、'6')组成的字节串,和原始数据毫无关系,修改后会丢失真实的业务信息。
正确解决方法
错误的根源是你用默认ASCII编码解码超出ASCII范围的字节(0x86不在0-127范围内),可以根据实际需求选择以下方案:
方案1:用兼容所有字节的编码解码
如果只是需要把字节转成可显示的字符串,推荐用latin-1编码(它能映射0-255的所有字节到对应字符):
import pandas as pd import numpy as np dict = {'trade_qualifier' : [b'\x86', b' ', b' ', b'\x02']} df = pd.DataFrame(dict) def decode_bytes(df): col = 'trade_qualifier' # 用latin-1解码每个字节 df[col] = df[col].str.decode('latin-1') return df decode_bytes(df)
解码后b'\x86'会变成字符,b' '保留为空格,b'\x02'变成,完整保留了原始字节对应的字符映射。
方案2:转成十六进制字符串保留字节信息
如果不需要字符映射,只想保留字节的原始十六进制表示,可以把字节转成十六进制字符串:
def decode_bytes(df): col = 'trade_qualifier' df[col] = df[col].apply(lambda x: x.hex()) return df
处理后b'\x86'会变成'86',b' '变成'20',b'\x02'变成'02',既避免了解码错误,又保留了原始字节的数值信息。
二、代码作用解析
你对df[col] = df[col].values.astype(np.str_).astype('O')的理解不完全正确,这行代码的执行逻辑分三步:
df[col].values:提取该列的numpy数组,此时数组元素是Python的bytes对象;.astype(np.str_):尝试把numpy数组里的每个bytes元素解码成numpy的str_类型(本质是Python字符串,但属于numpy的字符串数组类型),这里默认用ASCII编码解码,这也是触发UnicodeDecodeError的直接原因;.astype('O'):把numpy的字符串数组转成Python对象数组,也就是每个元素变成独立的Python字符串对象。
简单说,这行代码的目的是把字节列转成字符串列,但因为用了默认ASCII编码,遇到非ASCII字节就会报错。
内容的提问来源于stack exchange,提问作者user21641220
相关产品推荐
相关产品推荐

