Python 3:如何将字节串转为字符串(不解码且去除b前缀)
如何在Python 3中把字节串转为去掉
b前缀的字符串(无需解码) 嘿,我完全懂你的需求——你不需要对字节串做解码操作,只是想得到和打印字节串时去掉b前缀一模一样的字符串,对吧?比如输入b'\xb5\xb5\xb5\xb5\r\n1',要得到'\xb5\xb5\xb5\xb5\r\n1'这种格式。
首先说结论:Python 3里没有专门的内置方法直接干这个,但有个非常简洁的技巧可以实现,而且比你之前尝试的遍历方法高效得多。
方法一:利用repr()和字符串切片
字节串的repr()方法会返回它的可打印表示形式,也就是带b'前缀和'后缀的字符串。我们只需要把这部分多余的字符切掉就行:
my_bytestring = b'\xb5\xb5\xb5\xb5\r\n1' # 用repr()获取带b的字符串,然后切片去掉前2位(b')和最后1位(') result = repr(my_bytestring)[2:-1] print(result) # 输出: \xb5\xb5\xb5\xb5\r\n1 # 如果要保留外层的单引号,就直接去掉前缀的b即可: result_with_quotes = repr(my_bytestring).replace('b', '', 1) print(result_with_quotes) # 输出: '\xb5\xb5\xb5\xb5\r\n1'
这个方法的好处是完全利用Python内置函数,不需要自己处理各种转义字符(比如\r、\n或者十六进制转义),repr()已经帮你做好了所有格式转换。
为什么你之前的遍历方法不行?
你之前尝试遍历字节串时,每个元素返回的是字节对应的整数值(比如b'\xb5'遍历出来是181),所以直接把整数转成字符串拼接,自然得到的是数字串,而不是你想要的转义字符形式。
方法二:手动构建转义字符串(自定义需求时用)
如果需要更精细地控制转义格式,可以手动遍历字节串,把每个字节转换成对应的转义字符。不过这个方法代码量更大,适合有特殊需求的场景:
def bytes_to_raw_str(bs): parts = [] for byte in bs: # 处理可打印ASCII字符(除了反斜杠和单引号) if 32 <= byte <= 126 and byte not in (ord('\\'), ord("'")): parts.append(chr(byte)) # 处理回车、换行这类特殊转义 elif byte == ord('\r'): parts.append('\\r') elif byte == ord('\n'): parts.append('\\n') # 其他字节用十六进制转义表示 else: parts.append(f'\\x{byte:02x}') return ''.join(parts) my_bytestring = b'\xb5\xb5\xb5\xb5\r\n1' print(bytes_to_raw_str(my_bytestring)) # 输出: \xb5\xb5\xb5\xb5\r\n1
对比下来,第一种方法更简洁高效,完全能满足你的需求。
内容的提问来源于stack exchange,提问作者Yobmod
相关产品推荐
相关产品推荐

