Найти - Пользователи
Полная версия: можно ли заставить print декодировать вывод?
Начало » Python для новичков » можно ли заставить print декодировать вывод?
1
Игнат
использую 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()

и пока все ок

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

можно ли как-то сказать принту, чтобы он все выводимые строки декодировал перед выводом?
o7412369815963
в начале файла указать
# coding: utf-8
тогда будет кодировать в utf8 при выводе.
а ещё можно сам принт подемнить
Андрей Светлов
o7412369815963
в начале файла указать
# coding: utf-8
тогда будет кодировать в utf8 при выводе.
Это не верно. «# coding» никак не влияет на кодировку, используемую при I/O.
o7412369815963
Андрей Светлов
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
Андрей Светлов
Кодировка, используемая для print — это sys.stdout.encoding. На Ubuntu будет ‘UTF-8’
Та кодировка, которая указывается в начале модуля, будет влиять на кодировку строковых констант, используемых в этом самом модуле — и ни на что больше.
Естественно, если в вашем примере объявили что строка записана в 1251, а на самом деле использовали utf-8 — получили мусор. И не только при print.
o7412369815963
Андрей Светлов
Кодировка, используемая для print — это sys.stdout.encoding. На Ubuntu будет ‘UTF-8’
Та кодировка, которая указывается в начале модуля, будет влиять на кодировку строковых констант, используемых в этом самом модуле — и ни на что больше.
Естественно, если в вашем примере объявили что строка записана в 1251, а на самом деле использовали utf-8 — получили мусор. И не только при print.
Да, точно.
Андрей Светлов
Укажите это в вашей статье http://www.py-my.ru/post/4bfb3c6a1d41c846bc00009b , если не трудно
И reload(sys) мне категорически не нравится. Лучше объяснить, как сделать правильный sys.stdout/sys.stderr
o7412369815963
Порыскал по инету, предлагают:
sys.stdout = codecs.getwriter('utf8')(sys.stdout)
Но при таком решении не возможно вывести байтовую строку: print ‘привет’
Андрей Светлов
Наверное, нужно писать свой file-like object. В котором на write перебрасывать str без изменений, а для unicode делать конвертацию в нужную кодировку.
Я всегда так поступал — и ни разу не ломалось.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB