конвертировать из Unicode в Ascii Python - PullRequest
2 голосов
/ 02 февраля 2012

Хорошо .. Это может быть дубликатом .. но я не думаю, что я даже знаю правильную проблему.Я предполагаю, что у меня есть строка в Unicode .. (в основном я читаю из dong Монго .. и mongodb хранит все в этой форме ???? Честно говоря, я не уверен .. но это то, что я получаю ..

{ u'preview': u'Hello World!!'}

так что перед всеми полями стоит это "я". Я в основном пытаюсь извлечь их !!, а затем добавить их в одну гигантскую строку. Итак, допустим, я делаю что-то вроде:

 string =  ''
 resolve = foo['first_resolved_at']
 string += resolve

Так что выдает ошибку

TypeError: coercing to Unicode: need string or buffer, NoneType found

Что я делаю не так? Думаю, мне нужно преобразовать его в строку ... но как ??? Спасибо

Ответы [ 2 ]

2 голосов
/ 02 февраля 2012

Несмотря на то, что ответ был принят, я подумал, что для справки приведу пример того, как вы должны использовать join () вместо добавления строк вместе.Это также показывает вам, что он избегает значений None:

d = {u'a': u'a', u'c': None, u'b': u'b', u'e': None, u'd': None, u'g': u'g', u'f': u'f', u'i': u'i', u'h': u'h', u'k': u'k', u'j': u'j', u'm': None, u'l': u'l', u'o': u'o', u'n': None, u'p': u'p'}

resolve = ''.join((value for value in d.itervalues() if value is not None))
print resolve
# u'abgfihkjlop'

И если то, что вы хотели сделать, это только цикл по заранее определенному набору ключей:

keys = ('c', 'g', 'f', 'm')
''.join([v for v in (d[k] for k in keys) if v is not None])

Вот тест, показывающийразница между этим подходом, добавлением в список и добавлением строк вместе:

from time import time

d = {}
for i in xrange(1000):
    v = u'v%d' % i
    d[v] = v

def test1():
    return ''.join(v for v in d.itervalues() if v is not None)

def test2():
    result = []
    for v in d.itervalues():
        if v is not None:
            result.append(v)
    return ''.join(result)

def test3():
    result = ''
    for v in d.itervalues():
        if v is not None:
            result += v
    return result

def timeit(fn):
    start = time()
    r = fn()
    end = time() - start
    print "Sec:", end, "msec:", end*1000


>>> timeit(test1)
Sec: 0.000195980072021 msec: 0.195980072021
>>> timeit(test2)
Sec: 0.000204086303711 msec: 0.204086303711
>>> timeit(test3)
Sec: 0.000397920608521 msec: 0.397920608521

Вы можете видеть, что когда ваши циклы увеличиваются, это действительно имеет значение.

1 голос
/ 02 февраля 2012

Unicode to ascii - это просто str(some_unicode_string)

Это {u'preview ': u'Hello World !!'}

это карта.Обведите его, чтобы получить содержимое:

keys=[]
values=[]
for i in mymap:
    print i
    print "contains:",mymap[i]
    keys.append(i)
    values.append(i)

или просто mymap.keys() и mymap.values()

Так что я думаю, что вам вообще не следует преобразовывать свои строки.Но если вы хотите, то просто str(q)

РЕДАКТИРОВАТЬ:

Теперь ваш пример кода после редактирования работает.Я надеюсь, что это было полезно.

...