Python字典日志记录遇Unicode异常问题求助
解决日志记录含非ASCII字符字典的Unicode异常问题
我来帮你搞定这个日志记录时遇到的Unicode异常问题,之前处理SOAP接口数据的时候也碰到过类似的坑,给你几个实用的解决方案:
1. 先给日志配置加上UTF-8编码
很多时候问题出在日志文件的默认编码不支持非ASCII字符,所以第一步要确保logging模块写入文件时用UTF-8编码:
import logging # 配置日志时指定encoding参数 logging.basicConfig( filename='data_log.log', level=logging.INFO, encoding='utf-8', # 关键:强制用UTF-8编码写入 format='%(asctime)s - %(levelname)s - %(message)s' )
2. 用JSON序列化字典再记录
直接用str()或者格式化函数处理字典很容易踩编码坑,改用json.dumps()来序列化是更稳妥的方式,它能自动处理非ASCII字符和None这类特殊值:
import json ref = {'Name': 'John', 'Surname': 'Doe', 'MI': None, 'Title': u'\xe2\x80\xa2\tEngineer_I'} # ensure_ascii=False 可以保留原字符(比如那个•符号),不用转成\uXXXX的转义格式 log_content = json.dumps(ref, ensure_ascii=False, indent=2) logging.info(f"从SOAP接口获取的数据: {log_content}")
这样日志里会直接显示• Engineer_I,可读性更好,也不会触发Unicode异常。
3. 针对Python2的兼容处理(如果还在使用旧版本)
要是你还在维护Python2的脚本,得额外注意字符串编码转换,确保统一用Unicode来处理:
import logging import json ref = {'Name': 'John', 'Surname': 'Doe', 'MI': None, 'Title': u'\xe2\x80\xa2\tEngineer_I'} # Python2下要指定encoding参数,且日志消息要用Unicode字符串 log_content = json.dumps(ref, ensure_ascii=False, encoding='utf-8') logging.info(u"从SOAP接口获取的数据: %s" % log_content)
为什么之前会出错?
直接用str(ref)或者格式化输出时,Python会尝试把字典里的Unicode字符串转成系统默认编码(比如ASCII),遇到非ASCII字符就会抛出UnicodeEncodeError。而用JSON序列化+指定UTF-8编码的方式,从根源上避免了编码不匹配的问题。
内容的提问来源于stack exchange,提问作者akshat
相关产品推荐
相关产品推荐

