読者です 読者をやめる 読者になる 読者になる

sys.stdout のエンコードを変更する in Python3.0

課題

sys.stdout のエンコードを変更したい!!!

説明

sys.stdout のエンコードの変更は,Python2.6 までは

>>> sys.stdout = codecs.getwriter('utf-8')(sys.stdout)
>>> print u'ほげ'
ほげ

ってやります.

これを,Python3.0 でやると,

>>> sys.stdout = codecs.getwriter('utf-8')(sys.stdout)
>>> print('ほげ')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python30\lib\codecs.py", line 356, in write
    self.stream.write(data)
  File "C:\Python30\lib\io.py", line 1484, in write
    s.__class__.__name__)
TypeError: can't write bytes to text stream

となり,text stream に bytes 型のデータは書き込めませんって起こられます.
これは,codecs.StreamWriter が byte stream を要求するにもかかわらず,text stream (sys.stdoutio.TextIOWrapper) を渡しているからです.

解決!!

さて,解決方法です.

>>> sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
>>> print('ほげ')
ほげ

sys.stdout の元になる byte stream (sys.stdout.buffer) で io.TextIOWrapper を作り直してやるだけです.
io.TextIOWrapper の代わりに codecs.getwriter('utf-8') でもできますが,元が io.TextIOWrapper なのでお勧めしません.