2012-02-01 91 views
2

好的..这可能是重复的..但我不认为我甚至知道正确的问题。 我猜我在unicode中有一个字符串..(基本上我正在读取mongo分贝..和mongodb存储所有的形式????老实说,我不知道..但这是我得到..从unicode转换为ascii python

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

所以这款U”中的所有字段的前.. 我基本上是试图提取这些了!然后在一个巨大的字符串追加他们 所以可以说我做这样的事情:

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

因此它会抛出一个错误

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

我在做什么错? 我想我必须将其转换为一个字符串..但如何? 感谢

+2

我刚试过这个,它工作正常。请举例说明实际的错误并发布 - 这些频繁的编辑有点疯狂。 – 2012-02-01 22:59:57

+0

它适用于我 – RanRag 2012-02-01 23:00:52

+1

我认为这里有一些缺少的信息。 'foo'显然是某种django Query对象,或者是一个像defaultdict一样运行的pymongo包装,并且返回None作为缺少的键。添加ascii和unicode没有任何问题(尽管在循环中它不好,你应该加入)。 'resolve'显然是None,你需要检查你的值。 – jdi 2012-02-01 23:03:46

回答

2

尽管答案已被接受,但我想我会引用一个关于如何使用join()而不是将字符串添加到一起的示例。这也显示了其避免无值:

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

的Unicode为ASCII只是str(some_unicode_string)

这 {u'preview ':u'Hello世界!'}

是地图。遍历它来获得内容:

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

或只是mymap.keys()mymap.values()

所以我认为你不应该转换字符串的。但是,如果你想那么就​​str(q)

编辑:

现在修改后您的示例代码工作。我希望这是有用的。

+0

编辑。我们对此深感抱歉..混乱 – Fraz 2012-02-01 22:55:08

+0

肯定。答案还是一样的(只是跟着你的编辑) – 2012-02-01 22:58:39