Discord bot运行中途出现charmap解码UnicodeDecodeError错误如何解决?
报错原因
你遇到的UnicodeDecodeError本质是文件读取模式使用错误:
你读取的.pkl是Python pickle序列化生成的二进制文件,而你调用open()时用了默认的文本模式r,这种模式下Python会自动用当前运行环境的默认编码解码文件内容。你当前是Windows系统,从Atom启动时Python继承的默认编码是cp1252(也就是报错中的charmap编码),读取到pkl文件中0x8d这类不存在于cp1252映射表中的字节时,就会触发解码失败。
修复方案
- 最根本的修改是把所有读取
.pkl文件的open模式从文本模式r改成二进制读模式rb,二进制模式下不会做编码解码,直接对比字节内容即可,修改后的代码行如下:
if open("totpal_guilds/" + message.guild.name + ".pkl", "rb").read() == open("totpal_guilds/kort_dummy.pkl", "rb").read():
- 后续如果需要反序列化读取pkl的内容,也需要用
rb模式打开文件后调用pickle.load()处理,不要用文本模式直接读取内容。 - 额外建议:不要直接用
message.guild.name作为文件名,服务器名称可能包含emoji、特殊符号、斜杠等非法路径字符,容易触发文件读写异常,改用唯一且无特殊字符的服务器IDmessage.guild.id作为文件名会更稳定。
中途突然报错的原因
之前运行正常是因为此前触发判断逻辑的pkl文件内容刚好所有字节都能被当时运行环境的默认编码识别,出现报错大概率是两种情况:
- bot新加入了名称带特殊字符的服务器,或者旧有服务器修改了名称,生成的对应pkl文件中出现了cp1252无法解码的字节;
- 之前启动bot的环境默认编码是UTF-8,能识别的字节范围比cp1252更广,这次从Atom启动时环境默认编码变成了cp1252,之前能正常解码的内容现在无法解码。
内容的提问来源于stack exchange,提问作者Mymokol
相关产品推荐
相关产品推荐

