记录python字典,其中值可能有unicode错误

时间:2018-04-17 06:11:42

标签: python dictionary logging format python-unicode

我正在尝试将详细日志添加到现有脚本中。此脚本通过soap客户端API将数据提取到字典中。我正在使用日志记录模块和格式化函数来按原样记录这个字典。

在某些情况下,我得到如下的unicode异常,因为一个值可能有非ascii字符,导致异常。

示例参考:

ref = {'Name': 'John', 'Surname': 'Doe', 'MI': None, 'Title':  u'\xe2\x80\xa2\tEngineer_I'}
  

' \ xe2 \ x80 \ xa2 \ tEngineer_I',是.encode(' utf-8')表示通过查询以下返回的值。

目前代码:

logger = logging.getLogger(name)
ref_data = soap_query()
for ref in ref_data:
    logger.debug("This is the reference data: {}".format(ref))

错误:

UnicodeEncodeError: 'ascii' codec can't encode character u'\u2022' in position 0: ordinal not in range(128)

回溯

Traceback (most recent call last):
  File "stack.py", line 65, in <module>
    query_db(db_obj)
  File "stack.py", line 50, in query_db
    logger.info("This is the reference data: {}".format(ref))
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2022' in position 0: ordinal not in range(128)

解决方法

为了解决这个问题,我写了另一个函数如下:

# Dictionary comprehension to encode all unicode values as ascii and ignore errors
def convert_to_str(ref):
    return {k: v.encode('ascii', 'ignore') if v else v for k, v in ref.iteritems()}

有更好的解决方案吗?

这对我有用,但我想知道,如果有更好的方法来处理这个问题? 我可以将任何参数传递给logger或格式化函数以编码为ascii或忽略unicode错误吗?

我正在使用 Python 2.7.6

1 个答案:

答案 0 :(得分:0)

您可以使用str()将dict转换为字符串,遵循此代码

logger = logging.getLogger(name)
ref_data = soap_query()
for ref in ref_data:
    logger.debug("This is the reference data: {}".format(str(ref)))