迭代unicode字符串并与python字典中的unicode进行比较

时间:2011-08-07 17:36:55

标签: python unicode


我有两个包含日语单词和字符信息的python词典:

  1. vocabDic:包含词汇,关键词:词,值:包含相关信息的词典
  2. kanjiDic:包含汉字(单日语字符),键:汉字,值:字典及其相关信息

    现在我想遍历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
    
  3. 如果我将变量打印到命令行,我得到:
    词汇:作品,日文印刷品 v(for循环中词汇的一个字符):
    测试(字符在kanjiDic中查找):无

    对我而言,似乎for循环使编码变得混乱 我尝试了各种功能(解码,编码..)但到目前为止没有运气 关于如何使这个工作的任何想法?
    非常感谢帮助。

1 个答案:

答案 0 :(得分: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)    
債
務
の
天
井

请注意,以utf-8编码的第一个unicode字符为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))

也许我们可以猜测编码。