Уведомления

Группа в Telegram: @pythonsu

#1 Июль 1, 2011 08:58:46

Игнат
От:
Зарегистрирован: 2010-10-02
Сообщения: 224
Репутация: +  0  -
Профиль   Отправить e-mail  

можно ли заставить print декодировать вывод?

использую python 3.2 как cgi с апач

если выводить кириллицу стандартным print получаем - Traceback (most recent call last): File “/home/user/python3/config_editor.py”, line 46, in cnf.print_rows() File “/home/user/python3/config_editor_class.py”, line 39, in print_rows print(self.sections) UnicodeEncodeError: ‘ascii’ codec can't encode characters in position 2-7: ordinal not in range(128)

вывожу вот так:

def _print(text):
sys.stdout.buffer.write(text.encode('utf8'))
sys.stdout.flush()

и пока все ок

проблема в том, что нельзя быстро распечатать тот же словарь, если в нем есть кириллица - получаю этот эксепшен

можно ли как-то сказать принту, чтобы он все выводимые строки декодировал перед выводом?



Офлайн

#2 Июль 1, 2011 16:20:17

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

можно ли заставить print декодировать вывод?

в начале файла указать
# coding: utf-8
тогда будет кодировать в utf8 при выводе.
а ещё можно сам принт подемнить

Офлайн

#3 Июль 1, 2011 16:32:50

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

можно ли заставить print декодировать вывод?

o7412369815963
в начале файла указать
# coding: utf-8
тогда будет кодировать в utf8 при выводе.
Это не верно. «# coding» никак не влияет на кодировку, используемую при I/O.



Офлайн

#4 Июль 1, 2011 16:46:44

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

можно ли заставить print декодировать вывод?

Андрей Светлов
o7412369815963
в начале файла указать
# coding: utf-8
тогда будет кодировать в utf8 при выводе.
Это не верно. «# coding» никак не влияет на кодировку, используемую при I/O.
# coding: cp1251

print u'Привет'
Результат:
$ python 1.py 
Привет
————————————
# coding: utf8

print u'Привет'
Результат:
$ python 1.py 
Привет
Ubuntu 11.04, py 2.7.1

Отредактировано (Июль 1, 2011 16:47:15)

Офлайн

#5 Июль 1, 2011 17:15:08

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

можно ли заставить print декодировать вывод?

Кодировка, используемая для print — это sys.stdout.encoding. На Ubuntu будет ‘UTF-8’
Та кодировка, которая указывается в начале модуля, будет влиять на кодировку строковых констант, используемых в этом самом модуле — и ни на что больше.
Естественно, если в вашем примере объявили что строка записана в 1251, а на самом деле использовали utf-8 — получили мусор. И не только при print.



Офлайн

#6 Июль 1, 2011 21:07:37

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

можно ли заставить print декодировать вывод?

Андрей Светлов
Кодировка, используемая для print — это sys.stdout.encoding. На Ubuntu будет ‘UTF-8’
Та кодировка, которая указывается в начале модуля, будет влиять на кодировку строковых констант, используемых в этом самом модуле — и ни на что больше.
Естественно, если в вашем примере объявили что строка записана в 1251, а на самом деле использовали utf-8 — получили мусор. И не только при print.
Да, точно.

Офлайн

#7 Июль 1, 2011 22:32:38

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

можно ли заставить print декодировать вывод?

Укажите это в вашей статье http://www.py-my.ru/post/4bfb3c6a1d41c846bc00009b , если не трудно
И reload(sys) мне категорически не нравится. Лучше объяснить, как сделать правильный sys.stdout/sys.stderr



Офлайн

#8 Июль 5, 2011 22:00:14

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

можно ли заставить print декодировать вывод?

Порыскал по инету, предлагают:

sys.stdout = codecs.getwriter('utf8')(sys.stdout)
Но при таком решении не возможно вывести байтовую строку: print ‘привет’

Отредактировано (Июль 5, 2011 22:04:17)

Офлайн

#9 Июль 6, 2011 12:31:46

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

можно ли заставить print декодировать вывод?

Наверное, нужно писать свой file-like object. В котором на write перебрасывать str без изменений, а для unicode делать конвертацию в нужную кодировку.
Я всегда так поступал — и ни разу не ломалось.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version