2011-08-07 45 views
9


Tôi có hai bộ từ điển trăn chứa thông tin về từ Nhật Bản và các nhân vật:
lặp qua chuỗi unicode và so sánh với unicode trong từ điển python

  1. vocabDic: chứa từ vựng, chìa khóa: văn bản, giá trị: từ điển với các thông tin về nó
  2. KANJIDIC: chứa kanji (nhân vật Nhật Bản duy nhất), phím: kanji, giá trị: từ điển với thông tin về nó

    Bây giờ tôi muốn lặp throug h mỗi ký tự của mỗi từ trong từ vựng và tra cứu ký tự này trong từ điển kanji. Mục tiêu của tôi là tạo một tệp csv mà sau đó tôi có thể nhập vào cơ sở dữ liệu dưới dạng bảng tham gia cho từ vựng và chữ kanji.
    phiên bản My Python là 2,6
    Mã của tôi là như sau:

    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 
    

Nếu tôi in các biến vào dòng lệnh, tôi nhận được:
vocab: tác phẩm, bản in bằng tiếng Nhật
v (một ký tự của từ vựng trong vòng lặp for):
kiểm tra (ký tự tra cứu trong chữ kanjiDic): None

Với tôi, có vẻ như vòng lặp for messes mã hóa lên.
Tôi đã thử các chức năng khác nhau (giải mã, mã hóa ..) nhưng không may mắn cho đến nay.
Bất kỳ ý tưởng nào về cách tôi có thể làm việc này?
Trợ giúp sẽ được đánh giá rất nhiều.

+2

Bạn có thể sử dụng python 3 - unicode của nó tốt hơn – Mark

+1

hoặc, 'từ __future__ nhập unicode_literals'? – utdemir

+0

cảm ơn bạn rất nhiều! Cập nhật cho python 3 giải quyết vấn đề: D – daniela

Trả lời

11

Từ mô tả sự cố của bạn, có vẻ như vocab là một đối tượng được mã hóa str, không phải là đối tượng unicode.

Đối concreteness, giả sử vocab bằng u'債務の天井' mã hóa trong 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' 

Nếu bạn vòng qua mã hóa str đối tượng, bạn nhận được một byte tại một thời điểm: \xe5, sau đó \x82, sau đó \xb5 vv

Tuy nhiên nếu bạn lặp qua đối tượng unicode, bạn sẽ nhận được một ký tự unicode tại một thời điểm:

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

Lưu ý rằng các ký tự unicode đầu tiên, mã hóa trong utf-8, là 3 byte:

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

Đó là lý do Looping trên các byte, in một byte tại một thời điểm, (ví dụ print \xe5) không in được một ký tự dễ nhận biết.

Vì vậy, có vẻ như bạn cần giải mã các đối tượng str của mình và làm việc với các đối tượng unicode. Bạn không đề cập đến mã hóa nào bạn đang sử dụng cho các đối tượng str của mình.Nếu đó là utf-8, sau đó bạn muốn giải mã nó như thế này:

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

Nếu bạn không chắc chắn những gì mã hóa val['text'] là trong, gửi đầu ra của

print(repr(vocab)) 

và có lẽ chúng ta có thể đoán mã hóa .

+0

cảm ơn bạn rất nhiều vì lời giải thích dài của bạn! Điều này đã giúp tôi hiểu cách python xử lý unicode. :) – daniela