我有两个包含日语单词和字符信息的python词典:
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
如果我将变量打印到命令行,我得到:
词汇:作品,日文印刷品
v(for循环中词汇的一个字符):
测试(字符在kanjiDic中查找):无
对我而言,似乎for循环使编码变得混乱
我尝试了各种功能(解码,编码..)但到目前为止没有运气
关于如何使这个工作的任何想法?
非常感谢帮助。
答案 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))
也许我们可以猜测编码。