2015-07-07 3 views
1

Этот код работает должным образом. Единственная проблема заключается в том, что если есть символ Юникода, он преобразуется в ASCII.преобразовать символ в unicode

with open('test.idx', 'w') as writefile: 
    with open('test.dat') as myfile: 
     mystr=myfile.read() 
     for myword in mystr.split('|'): 
      tow=myword, '|', mystr.index(myword) 
      print >>writefile, tow 

In [74]: !cat test.dat 
UTF-8 
जनन|1 
जन्म देणे 
शिक्षण|1 
क्षेत्रातील संशोधनाच्या बाजारीकरणा बाबतीत व्यक्त केलेली 
पूर्व|1 
पगड्यामुळे 

In [75]: !cat test.idx 
('UTF-8\n\xe0\xa4\x9c\xe0\xa4\xa8\xe0\xa4\xa8', '|', 0) 

Я ожидаю увидеть unicode вместо экранированного кода.

+0

Вы видите результат вывода, потому что вы пишете кортежи, попробуйте 'print >> writefile," .join (map (str, tow)) 'и вы увидите правильный вывод –

+0

Вы создали * tuple *, и, подобно преобразованию любого контейнера Python (списка, словаря и т. д.) в строку, содержимое представлено с выводом 'repr()'. Если это не правильный вывод, ** не пишите исходный кортеж **. –

+2

Обратите внимание, что у вас есть ** данные UTF-8 **, а не Юникод. Понятия связаны, но не одно и то же. –

ответ

1

Вы видите представление repr, поскольку вы храните данные в кортеже. Для того, чтобы соответствовать предполагаемое использование выходного str.join:

 print >>writefile, "".join(map(str,tow)) 

Выходной файл будет содержать:

UTF-8 
जनन|0 
1 
जन्म देणे 
शिक्षण|16 
1 
क्षेत्रातील संशोधनाच्या बाजारीकरणा बाबतीत व्यक्त केलेली 
पूर्व|63 
1 
पगड्यामुळे|239 

Если добавить print(tow) в вашем коде, вы увидите у вас есть кортежи.

('UTF-8\n\xe0\xa4\x9c\xe0\xa4\xa8\xe0\xa4\xa8', '|', 0) 
('1\n\xe0\xa4\x9c\xe0\xa4\xa8\xe0\xa5\x8d\xe0\xa4\xae \xe0\xa4\xa6\xe0\xa5\x87\xe0\xa4\xa3\xe0\xa5\x87\n\xe0\xa4\xb6\xe0\xa4\xbf\xe0\xa4\x95\xe0\xa5\x8d\xe0\xa4\xb7\xe0\xa4\xa3', '|', 16) 
('1\n \xe0\xa4\x95\xe0\xa5\x8d\xe0\xa4\xb7\xe0\xa5\x87\xe0\xa4\xa4\xe0\xa5\x8d\xe0\xa4\xb0\xe0\xa4\xbe\xe0\xa4\xa4\xe0\xa5\x80\xe0\xa4\xb2 \xe0\xa4\xb8\xe0\xa4\x82\xe0\xa4\xb6\xe0\xa5\x8b\xe0\xa4\xa7\xe0\xa4\xa8\xe0\xa4\xbe\xe0\xa4\x9a\xe0\xa5\x8d\xe0\xa4\xaf\xe0\xa4\xbe \xe0\xa4\xac\xe0\xa4\xbe\xe0\xa4\x9c\xe0\xa4\xbe\xe0\xa4\xb0\xe0\xa5\x80\xe0\xa4\x95\xe0\xa4\xb0\xe0\xa4\xa3\xe0\xa4\xbe \xe0\xa4\xac\xe0\xa4\xbe\xe0\xa4\xac\xe0\xa4\xa4\xe0\xa5\x80\xe0\xa4\xa4 \xe0\xa4\xb5\xe0\xa5\x8d\xe0\xa4\xaf\xe0\xa4\x95\xe0\xa5\x8d\xe0\xa4\xa4 \xe0\xa4\x95\xe0\xa5\x87\xe0\xa4\xb2\xe0\xa5\x87\xe0\xa4\xb2\xe0\xa5\x80 \n\xe0\xa4\xaa\xe0\xa5\x82\xe0\xa4\xb0\xe0\xa5\x8d\xe0\xa4\xb5', '|', 63) 
('1\n \xe0\xa4\xaa\xe0\xa4\x97\xe0\xa4\xa1\xe0\xa5\x8d\xe0\xa4\xaf\xe0\xa4\xbe\xe0\xa4\xae\xe0\xa5\x81\xe0\xa4\xb3\xe0\xa5\x87', '|', 239) 

У вас также есть UTF-8 закодированные строки не юникод, если вы напечатали отдельные элементы из пакли вы бы также увидеть правильный выход.

2

Вы создали кортеж:

tow=myword, '|', mystr.index(myword) 

Это не строковый объект, это кортеж, содержащий три других объектов, два из которых являются строки, одно целое.

Когда вы пишете этот кортеж в файл, Python должен преобразовать его в строку. Преобразование любого контейнера Python (будь то кортеж, список, набор или словарь) будет использовать представление содержащихся объектов repr(). Для строк это означает, что разрешены и показаны только печатные символы ASCII, все остальное использует escape-последовательности, чаще всего форму \xhh.

Если это неправильный вывод для вашего usecase, вам нужно выполнить преобразование строки самостоятельно. Вы можете использовать строку форматирование:

tow = '{}|{}'.format(myword, mystr.index(myword)) 

Если вы производите много | -разделенных данных, вы можете захотеть взглянуть на csv модуле вместо того, чтобы обрабатывать разделитель и запись файлов.

Смежные вопросы