Могу ли я перенаправить вывод Unicode из консоли прямо в файл? - PullRequest
30 голосов
/ 03 апреля 2011

У меня есть скрипт Python, который выводит Unicode на консоль, и я хотел бы перенаправить его в файл. По-видимому, процесс перенаправления в python включает в себя преобразование вывода в строку, поэтому я получаю ошибки о невозможности декодирования символов Юникода.

Итак, есть ли способ выполнить перенаправление в файл, закодированный в UTF-8?

Ответы [ 4 ]

32 голосов
/ 03 апреля 2011

При печати на консоль Python просматривает sys.stdout.encoding, чтобы определить кодировку, используемую для кодирования объектов Unicode перед печатью.

При перенаправлении вывода в файл sys.stdout.encoding имеет значение None, поэтому Python2 по умолчанию использует кодировку ascii. (В отличие от Python3 по умолчанию utf-8.) Это часто приводит к исключению при печати Unicode.

Вы можете избежать ошибки, явно кодировав юникод перед печатью:

print (unicode_obj.encode('utf-8'))

или вы можете переопределить sys.stdout, чтобы весь вывод был закодирован в utf-8:

import sys
import codecs
sys.stdout=codecs.getwriter('utf-8')(sys.stdout)
print(unicode_obj)
14 голосов
/ 03 апреля 2011

Установите переменную среды PYTHONIOENCODING в нужную кодировку перед перенаправлением скрипта Python в файл.Тогда вам не придется изменять оригинальный скрипт.Обязательно напишите также Unicode строки, иначе PYTHONIOENCODING не будет иметь никакого эффекта.Если вы пишете байтовые строки, байты отправляются на терминал как есть (или перенаправленный файл).

5 голосов
/ 16 октября 2012

В Linux вы можете использовать tee и перенаправить stderr в /dev/null.

python script.py 2>/dev/null | tee filename.txt

Вам также не нужно изменять скрипт Python.

3 голосов
/ 03 апреля 2011
import codecs
file_object = codecs.open( "filename", "w", "utf-8" )
file_object.write(u"खऔणन")
file_object.close()


Это должно сделать работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...