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

解码字节时移除转义是否正确?及相关代码作用解析

问题解答

一、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')的理解不完全正确,这行代码的执行逻辑分三步:

  1. df[col].values:提取该列的numpy数组,此时数组元素是Python的bytes对象;
  2. .astype(np.str_):尝试把numpy数组里的每个bytes元素解码成numpy的str_类型(本质是Python字符串,但属于numpy的字符串数组类型),这里默认用ASCII编码解码,这也是触发UnicodeDecodeError的直接原因;
  3. .astype('O'):把numpy的字符串数组转成Python对象数组,也就是每个元素变成独立的Python字符串对象。

简单说,这行代码的目的是把字节列转成字符串列,但因为用了默认ASCII编码,遇到非ASCII字节就会报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 06:27:45