Форум сайта python.su
Пишу
# -*- coding: utf-8 -*-
import string
s = u“тест”
table1 = string.maketrans(“йцукен”,“qwerty”)
s.translate(table2)
Ругается что
maketrans arguments must have same length
Пробую так
# -*- coding: utf-8 -*-
import string
s = u“тест”
table1 = string.maketrans(u“йцукен”,u“qwerty”)
s.translate(table2)
Орет
exceptions.UnicodeEncodeError: ‘ascii’ codec can't encode characters in position 0-5: ordinal not in range(128)
Как быть?
Офлайн
Мда в перле это решается 2 строчками
use encoding “UTF-8”;
$test =~ tr/qwerty/йцукен/;
Питон такого не осилит?
Офлайн
# -*- coding: utf-8 -*-
import string
s = “тест”
print len(“йцукен”)
print len(“qwerty”)
12
6
Ошибка возникла потому, что кодировка файла - utf-8 (кириллические символы - двухбайтовые). В восьмибитной кодировке такой проблемы нет.import string
s = “тест”
table1 = string.maketrans(“йцукен”,“qwerty”)
print s.translate(table1)
тtст
В обеих случаях юникод объекты смешиваются со строками, в таких случаях нужно быть очень внимательным (так, например, string.maketrans ожидает экземпляры str, а не unicode)
Офлайн
Похоже модуль string (в отличии от re например) не поддерживает работу с интернациональными символами в юникоде.
Однако различные перекодировки decode encode из utf8 (в cp1251 например) тоже ничего не дали, maketrans перестает ругаться, однако на выходе ничего не преобразовывает.
И зачем нужна эта библиотека тогда?
Пришлось лепить такой велосипед.
uni = u“werty”
w=0
for i in list(u“qwerty”):
char = (i)
char2 = u“йцукен”
w=w+1
uni = uni.replace(char,char2)
print uni
Не ожидал, что с базовыми операциями существует такой гемор.
Офлайн
SpektrВыглядит стремно, но все же работает :)
Однако различные перекодировки decode encode из utf8 (в cp1251 например) тоже ничего не дали, maketrans перестает ругаться, однако на выходе ничего не преобразовывает.
Python 2.5.1 (r251:54863, Oct 30 2007, 13:54:11) [GCC 4.1.2 20070925 (Red Hat 4.1.2-33)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import string >>> test_str = u'Тестируем' >>> test_str = test_str.encode('cp1251') >>> tbl = string.maketrans(u'тс'.encode('1251'), 'ts') >>> print test_str.translate(tbl).decode('cp1251').encode('utf-8') Теstируем >>>
Офлайн
Как я понимаю, официальный путь - использовать codecs совместно с unicode строками. Остальное - от лукавого
Офлайн
def str_tran(str_in, table_in, table_out) :
str_out = ''
for chr_in in list(str_in) :
try : str_out += table_out
except : str_out += chr_in
return str_out
print str_tran(u'trewq123', u'qwerty', u'йцукен')
Офлайн
u'йцукен'.translate(…) – рвет всех по читаемости. остальное – велосыпеды.
Офлайн
SpektrА не надо на Питоне писать программы на Перле. И все будет хорошо.
Мда в перле это решается 2 строчками
use encoding “UTF-8”;
$test =~ tr/qwerty/йцукен/;
Питон такого не осилит?
Офлайн
Добрался до линуксовой тачки и попробовал еще раз вариант с энкодом в cp1251 - заработало.
В винде, как я писал ошибок не вызывало, но ничего не давало на выход.
Ну так как скрипт для линукса, проблему можно считать решенной.)
bialix :)
Офлайн