2011-08-07 70 views
9


我有一個包含關於日本字和字符信息的兩個Python字典:
迭代通過unicode字符串和使用Unicode比較Python字典

  1. vocabDic:包含的詞彙,重點:字,值:隨着信息詞典它
  2. KANJIDIC:包含漢字(單日文字符),鍵:漢字,值:字典,它

    現在的信息,我想迭代通過量h vocabDic中每個單詞的每個字符,並在漢字字典中查找該字符。我的目標是創建一個csv文件,然後我可以將它導入數據庫,作爲詞彙和漢字的連接表。
    我的Python版本是2.6
    我的代碼如下:

    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 
    

如果我打印變量的命令行,我得到:
翻譯:作品,在日本
打印v(for循環中詞彙的一個字符):
測試(字符在漢字中查找):無

對我來說,似乎for循環會擾亂編碼。
我試過各種功能(解碼,編碼..),但沒有運氣到目前爲止。
關於如何使這項工作有任何想法?
幫助將非常感激。

+2

您可以使用python 3 - 它的unicode更好嗎 – Mark

+1

或者'from __future__ import unicode_literals'? – utdemir

+0

非常感謝!更新到python 3解決了這個問題:D – daniela

回答

11

從您對問題的描述中,聽起來像vocab是編碼str對象,而不是unicode對象。

爲具體,假設vocab等於u'債務の天井'編碼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' 

如果您遍歷所有的編碼str對象,你在一個時間內得到一個字節:\xe5,然後\x82,然後\xb5

但是,如果您循環播放unicode對象,則一次只能獲得一個Unicode字符:

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

注意第一Unicode字符,在utf-8編碼,是3個字節:

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

這就是爲什麼循環過的字節數,一次打印一個字節,(例如print \xe5)無法打印可識別的字符。

所以它看起來像你需要解碼你的str對象和unicode對象的工作。您沒有提及您用於str對象的編碼。如果是utf-8,那麼你會像這樣解碼:

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

如果你不知道什麼編碼val['text']是,發佈的

print(repr(vocab)) 

輸出,也許我們可以猜測編碼。

+0

非常感謝您的長期解釋!這幫助我瞭解了python如何處理unicode。 :) – daniela