Из вашего описания проблемы это звучит так: 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))
и, возможно, мы можем угадать кодировку.