Операции над текстом кириллицей в Python 2.7

5065584

Необходимо считать из файла текст кириллицей (utf-8) и провести над некоторыми словами ряд операций (lower/upper, например, то есть изменить регистр но либо получается UnicodeDecodeError, либо функция над текстом просто не исполняется.
Не подскажете, как эту нехитрую операцию проделать максимально коротким путем?
Библиотеку codecs импортировал
Вообще, как правильно работать с данными в UTF-8 в Питоне?

khachin


import codecs
f = codecs.open("myfile.txt", "r", "utf-8")
text = f.read

Текстовые строки будут иметь приставку u
Т.е. если строка — ASCII, то она имеет вид: 'mytext', если строка — юникод, она имеет вид: u'mytext'

5065584

Спасибо. А как в таком случае выводить в utf-8 в файл?
Строчки, введенные непосредственно в коде, также помечать u перед кавычками - и этого достаточно для адекватного отображения?

bav46

а что мешает всему скрипту работать в utf8, соответственно заморачиваться не будешь когда у тебя все будет юникоде. единственное заморочки пойдут на экспорте например в другие кодировки - теже файлы. с кодировками в питоне реально не все прозрачно и надо понимать где и что может всплыть.
я конечно не такой гуру питона как снежный макс, но то что пописываю для себя все держу в юникоде

Plok2008

а что мешает всему скрипту работать в utf8
Python3 умеет сам нативно unicode, и ни с чем заморачиваться не нужно, топикстартеру же нужно это делать в Python27, так что придётся много раз делать encode/decode по мере работы. Но если все строки были изначально загружены в юникодные, aka u'text', то всё upper/lower на них должен нормально работать.

SCIF32


import sys
for i in sys.readlines:
    line = line.decode("utf-8").rstrip("\r\n") # преобразовываем обычную строку в wide с использованием utf-8
    line = line.lower
    print line.encode("utf-8") # преобразовываем wide строку в обычную, кодируя символы utf-8

PS
надо просто в голове держать, что на вход ты получаешь байтики, а внутри программы удобно (не всегда, конечно) работать со строками, в которых каждый итерируемый элемент - буква языка.
то есть кодировка появляется только при вводе-выводе, а внутри программы у тебя строки хранятся как u"aaaa" - то есть никакой кодировки у таких строк нет.

apl13

Астрологи объявили месяц кириллицы в p*-скриптовых языках.

khachin

А как в таком случае выводить в utf-8 в файл?
Сложно двумя словами описать encode и decode в сферическом вакууме. Был бы пример живого файла или кода, можно было бы конкретней разобрать. Файл можно открыть для чтения в режимах 'r' и 'rb' (записи — соответственно 'w' и 'wb' причем я предпочитаю работать с бинарными данными, байты могут писаться по одному и по два (utf-8 использует 2 байта на знак)... Слишком много ответвлений для обсуждения, высок шанс отклониться от нужной темы, не зная конкретики.
Есть хорошая презентация: ТЫЦ. Если что-то останется не до конца понятно, пиши.
Оставить комментарий
Имя или ник:
Комментарий: