2011-08-07 27 views
9


Tengo dos diccionarios de Python que contienen información acerca de palabras japonesas y caracteres:
iterar a través de cadenas Unicode y comparar con Unicode en el diccionario de Python

  1. vocabDic: contiene el vocabulario, la clave: palabra, valor: diccionario con información de al respecto
  2. kanjidic: contiene kanji (solo carácter japonés), clave: kanji, valor: diccionario con información sobre el mismo

    Ahora me gustaría repetir throug h cada carácter de cada palabra en el vocabDic y busca este personaje en el diccionario kanji. Mi objetivo es crear un archivo csv que luego pueda importar a una base de datos como tabla de unión para vocabulario y kanji.
    versión Mi Python es 2.6
    Mi código es el siguiente:

    kanjiVocabJoinWriter = csv.writer(open('kanjiVocabJoin.csv', 'wb'), delimiter=',', quotechar='|', quoting=csv.QUOTE_MINIMAL) 
    kanjiVocabJoinCount = 1 
    
    #loop through dictionary 
    for key, val in vocabDic.iteritems(): 
        if val['lang'] is 'jpn': # only check japanese words 
         vocab = val['text'] 
         print vocab 
         # loop through vocab string 
         for v in vocab: 
          test = kanjiDic.get(v) 
          print v 
          print test 
          if test is not None: 
           print str(kanjiVocabJoinCount)+','+str(test['id'])+','+str(val['id']) 
           kanjiVocabJoinWriter([str(kanjiVocabJoinCount),str(test['id']),str(val['id'])]) 
           kanjiVocabJoinCount = kanjiVocabJoinCount+1 
    

Si puedo imprimir las variables de la línea de comandos, me sale:
vocabulario: obras, grabados en japonés
v (un carácter del vocabulario en el bucle for):
prueba (el carácter buscado en el kanjiDic): Ninguno

Para mí, parece que el bucle for confunde la codificación.
Probé varias funciones (decodificar, codificar ...) pero hasta ahora no tuve suerte.
Alguna idea sobre cómo podría hacer que esto funcione?
Ayuda sería muy apreciada.

+2

¿Podría usar Python 3 - su Unicode es mejor – Mark

+1

o 'from __future__ import unicode_literals'? – utdemir

+0

muchas gracias! La actualización a python 3 resolvió el problema: D – daniela

Respuesta

11

Desde su descripción del problema, parece que vocab es un objeto codificado str, no un objeto unicode.

Para ser concretos, supongamos vocab es igual a u'債務の天井' codifican en utf-8:

In [42]: v=u'債務の天井' 
In [43]: vocab=v.encode('utf-8') # val['text'] 
Out[43]: '\xe5\x82\xb5\xe5\x8b\x99\xe3\x81\xae\xe5\xa4\xa9\xe4\xba\x95' 

Si aro sobre el str objeto codificado, se obtiene un byte a la vez: \xe5, entonces \x82, entonces \xb5, etc.

Sin embargo, si recorre el objeto Unicode, obtendría un carácter Unicode a la vez:

In [45]: for v in u'債務の天井': 
    ....:  print(v)  
債 
務 
の 
天 
井 

Tenga en cuenta que el primer carácter Unicode, codificado en utf-8, es de 3 bytes:

In [49]: u'債'.encode('utf-8') 
Out[49]: '\xe5\x82\xb5' 

Por eso bucle a través de los bytes, la impresión de un byte a la vez, (por ejemplo, print \xe5) no puede imprimir un caracter reconocible.

Parece que necesita decodificar sus objetos str y trabajar con objetos unicode. No mencionó qué codificación está utilizando para sus objetos str.Si se trata de utf-8, entonces lo que decodificar así:

vocab=val['text'].decode('utf-8') 

Si no está seguro de lo que está en la codificación val['text'], publicar la salida del

print(repr(vocab)) 

y tal vez puede adivinar la codificación .

+0

muchas gracias por su larga explicación! Esto me ayudó a entender cómo maneja Python unicode. :) – daniela

Cuestiones relacionadas