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

Python3中将含混合UTF-8转义字符的类字节串转换为正常文本

问题根源

你遇到的问题本质是对bytes类型做了错误的字符串转换:

  • requests库的resp.content返回值是原始字节(bytes类型),你以文本模式("w")打开文件时,write()方法只接受字符串类型,直接传bytes必然报TypeError。
  • 你之前用str(resp.content)做转换是完全错误的:这个操作不会把字节按编码解码成人类可读的文本,只会把字节对象的字面表示(也就是带b''前缀、\x开头转义序列的打印内容)转成普通字符串,这就是为什么你检查变量类型是str,但内容看起来还是字节串结构的原因。
解决方案

分两种场景处理:

修复已经生成的错误字符串

如果你已经拿到了这种形如b'xxx'的错误字符串(存在str_data变量里),可以用ast.literal_eval先把它解析回真实的bytes对象,再按UTF-8解码即可:

import ast

# 将字节串的字符串表示还原为真实bytes对象
real_byte_data = ast.literal_eval(str_data)
# 按UTF-8解码得到正常文本
correct_text = real_byte_data.decode("utf-8")

执行后correct_text就是和原始字节匹配的正确文本,你给出的字节样例解码结果为:

Sample data plus some Japanese characters ずぜ日銀だけ違うのか?———— and then more data

注:你写的预期结果里开头的「なぜ」和字节内容不匹配,属于笔误,上述解码结果完全和你提供的原始字节对应。

从源头修正代码,避免后续生成错误数据

后续写请求和存储逻辑时二选一即可,绝对不要用str()直接转换bytes类型:

  • 方案1:直接用requests自带的文本解码能力,手动指定编码避免自动识别错误
resp = requests.get(get_url)
# 强制指定响应编码为UTF-8
resp.encoding = "utf-8"
# 文件写入时也指定UTF-8编码,避免不同系统默认编码不一致出问题
with open(self.export_file, "w", encoding="utf-8") as f:
    f.write(resp.text)
  • 方案2:以二进制模式写入文件,不需要做编解码转换
resp = requests.get(get_url)
# 注意打开模式为"wb"(二进制写入),可以直接写bytes类型
with open(self.export_file, "wb") as f:
    f.write(resp.content)

踩坑提醒:Python3中str是Unicode文本类型,bytes是原始字节序列,两者转换必须显式指定编码,直接用str()转bytes、或者不指定编码直接调用encode()/decode()都很容易出乱码问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 06:27:27