2015-03-31 1 views
-1

Я использую pymongo для вставки сложной структуры в виде строки в коллекции. Структура представляет собой ДИКТ из списка dicts перечней dicts и т.д ..Python: Не удается найти поле unicode, вызывающее bson.errors.InvalidDocument во время вставки mongo

Есть ли способ, чтобы выяснить, какие поля юникода вместо ул, что вызывает ошибку? Я пробовал:

def dump(obj): 
    with open('log', 'w') as flog: 
    for attr in dir(obj): 
     t, att = type(attr), getattr(obj, attr) 
     output = "obj.%s = %s" % (t, att) 
     flog.write(output) 

, но не повезло до сих пор.

Любой умный рекурсивный способ распечатать все, может быть?

Благодаря

ответ

0

Следующий помогла мне выяснить, какой Словарь содержится значение Юникода, так как ДИКТ можно определить по его ключам. Список не помогает.

def find_the_damn_unicode(obj): 

    if isinstance(obj, unicode): 
     ''' The following conversion probably doesn't do anything meaningfull since 
      obj is probably a primitive type, thus passed by value. Thats why encoding 
      is also performed inside the for loops below''' 
     obj = obj.encode('utf-8') 
     return obj 

    if isinstance(obj, dict): 
     for k, v in obj.items(): 
      if isinstance(v, unicode): 
       print 'UNICODE value with key ', k 
       obj[k] = obj[k].encode('utf-8') 
      else: 
       obj[k] = find_the_damn_unicode(v) 

    if isinstance(obj, list): 
     for i, v in enumerate(obj): 
      if isinstance(v, unicode): 
       print 'UNICODE inside a ... list' 
       obj[i] = obj[i].encode('utf-8') 
      else: 
       obj[i] = find_the_damn_unicode(v) 

    return obj