如何将带b前缀的unicode字符串转换为无b前缀的普通字符串?
问题:将带b前缀的Unicode字符串转换为普通字符串
从其他设备获取的数据如下:
foo = { "abc": "b'E3:DE'" }
这里的"b'E3:DE'"被识别为unicode类型,尝试使用encode、decode方法无法去除b前缀——因为b是字符串的一部分,并非真正的bytes类型标记。
测试代码及输出
测试代码:
foo = xxx.get("abc") logger.info("1 foo type {0} against {1} isinstance(foo, unicode) {2}".format(type(foo), type(b''), isinstance(foo, unicode))) logger.info("2 before anything {0}".format(foo)) foo1 = foo.encode("utf-8") logger.info("3 after encode foo1 {0} type {1} upper {2}".format(foo1, type(foo1), foo1.upper())) bar = foo.decode("utf-8") logger.info("4 after decode bar {0} type {1} upper {2}".format(bar, type(bar), bar.upper()))
输出结果:
INFO|1 foo type <type 'unicode'> against <type 'str'> isinstance(foo, unicode) True INFO|2 before anything b'E3:DE' INFO|3 after encode foo b'E3:DE' type <type 'str'> upper B'E3:DE' INFO|4 after decode foo b'E3:DE' type <type 'unicode'> upper B'E3:DE'
解决方案
方法1:使用ast.literal_eval(推荐)
这是Python内置的安全解析方法,能将字符串形式的bytes表示转换为真正的bytes对象,再解码为普通字符串:
import ast foo = xxx.get("abc") # 解析为bytes对象后解码 result = ast.literal_eval(foo).decode("utf-8") print(result) # 输出: E3:DE
优势:能处理格式规范的bytes字符串表示,比如B'E3:DE'(大写B)也能正确解析,兼容性更强。
方法2:字符串截取(简单直接)
如果能确定字符串格式固定为b'xxx'或B'xxx',可以直接截取中间内容:
foo = xxx.get("abc") # 跳过开头的b'或B',去掉结尾的' result = foo[2:-1] print(result) # 输出: E3:DE
注意:此方法依赖字符串格式完全符合预期,若格式有变动(比如使用双引号、缺少引号等)需要调整截取逻辑。
内容的提问来源于stack exchange,提问作者nathan
相关产品推荐
相关产品推荐

