Как изменить кодировку stdin и stdout на Python 2

Я использую машины Windows и Linux для одного и того же проекта. Кодировка по умолчанию для stdin в Windows — cp1252, а в Linux — utf-8.

Я хотел бы изменить все на utf-8. Является ли это возможным? Как мне это сделать?

Этот вопрос касается Python 2; для Python 3 см. Python 3: Как указать кодировку стандартного ввода


person duduklein    schedule 29.04.2010    source источник


Ответы (4)


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

Лучший подход — везде использовать unicode и везде использовать codecs.open или codecs.getwriter. Вы заключаете sys.stdout в объект, который автоматически кодирует ваши строки Unicode в UTF-8, используя, например:

sys.stdout = codecs.getwriter('utf-8')(sys.stdout)

Однако это будет работать, только если вы везде используете юникод. Итак, используйте юникод везде. Действительно, везде.

person Thomas Wouters    schedule 29.04.2010
comment
stdin не декодируется автоматически, поэтому вам всегда придется делать это самостоятельно. И предполагать, что ввод является UTF-8, вероятно, плохая идея, но есть codecs.getreader('utf-8')(sys.stdin), если вы действительно этого хотите. - person Thomas Wouters; 30.04.2010
comment
Обратите внимание, что в отличие от Python 2, Python 3 фактически автоматически декодирует стандартный ввод: docs .python.org/3/library/sys.html#sys.stdin — это поведение можно изменить, как описано в документации. - person Dr. Jan-Philip Gehrcke; 08.02.2014
comment
Есть ли способ в Python 3 принудительно изменить кодировку STDIN независимо от переменных среды? - person CMCDragonkai; 26.06.2018
comment
В Python 3.8 codecs.getreader('utf-8')(sys.stdin) не работает. Вместо этого используйте codecs.getreader('utf-8')(sys.stdin.buffer) и codecs.getwriter('utf8')(sys.stdout.buffer). - person Eponymous; 23.03.2020

Это старый вопрос, но только для справки.

Чтобы прочитать UTF-8 из stdin, используйте:

UTF8Reader = codecs.getreader('utf8')
sys.stdin = UTF8Reader(sys.stdin)

# Then, e.g.:
for _ in sys.stdin:
    print _.strip()

Чтобы записать UTF-8 в stdout, используйте:

UTF8Writer = codecs.getwriter('utf8')
sys.stdout = UTF8Writer(sys.stdout)

# Then, e.g.:
print 'Anything'
person Tomasz Nguyen    schedule 11.12.2014
comment
В Python 3.8 codecs.getreader('utf-8')(sys.stdin) (эквивалент этого поста) не работает. Вместо этого используйте codecs.getreader('utf-8')(sys.stdin.buffer) и codecs.getwriter('utf8')(sys.stdout.buffer). - person Eponymous; 23.03.2020

Python автоматически определяет кодировку стандартного ввода. Самый простой способ указать кодировку, когда автоматическое обнаружение не работает должным образом, — это использовать ссылку PYTHONIOENCODING, как в следующем примере:

pipeline | PYTHONIOENCODING="UTF-8" /path/to/your-script.py

Для получения дополнительной информации об обнаружении кодировки и этой переменной на разных платформах вы можете посмотреть sys.stdin документации.

person johnf    schedule 06.02.2016

Я использовал простой фрагмент кода, который работает для меня в Ubuntu: python2.7 и python3.6.

from sys import version_info
if version_info.major == 2:  # for python2
    import codecs
    # for stdin
    UTF8Reader = codecs.getreader('utf8')
    sys.stdin = UTF8Reader(sys.stdin)
    # for stdout
    UTF8Writer = codecs.getwriter('utf8')
    sys.stdout = UTF8Writer(sys.stdout)
elif version_info.major == 3:  # for python3
    import codecs
    # for stdin
    UTF8Reader = codecs.getreader('utf8')
    sys.stdin = UTF8Reader(sys.stdin.buffer)
    # for stdout
    UTF8Writer = codecs.getwriter('utf8')
    sys.stdout = UTF8Writer(sys.stdout.buffer)
person Tranfer Will    schedule 18.10.2019