首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python 2.7: print不对io模块使用unicode吗?

Python 2.7: print不对io模块使用unicode吗?
EN

Stack Overflow用户
提问于 2013-01-08 06:53:38
回答 2查看 916关注 0票数 3
代码语言:javascript
复制
import sys, codecs, io

codecsout = codecs.getwriter('utf8')(sys.stdout)
ioout = io.open(sys.stdout.fileno(), mode='w', encoding='utf8')
print >> sys.stdout, 1
print >> codecsout, 2
print >> ioout, 3

失败,出现以下错误:

代码语言:javascript
复制
1
2
Traceback (most recent call last):
  File "print.py", line 7, in <module>
    print >> ioout, 3
TypeError: must be unicode, not str

使用来自__future__print(3, file=ioout)也会失败。

print不知道如何与io模块对话吗?

EN

回答 2

Stack Overflow用户

发布于 2013-01-08 07:25:52

即使你给它一个显式的Unicode字符串,它也不能工作。

代码语言:javascript
复制
>>> print >> ioout, u'3'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: must be unicode, not str

我猜问题出在自动附加到末尾的换行符中。未来的打印功能似乎不会有同样的问题:

代码语言:javascript
复制
>>> from __future__ import print_function
>>> print(unicode(3), file=ioout)
3
票数 2
EN

Stack Overflow用户

发布于 2013-01-08 10:17:26

print语句对它打印的每一项内容隐式调用__str__sys.stdout是一个字节流,所以向它发送一个str就可以了。codecs.getwriter是一个旧的Python API,所以我猜它只是像Python2.x传统上那样隐式地将str转换为unicode。然而,与Python3.x一样,新的io模块严格要求将str转换为unicode,这就是它抱怨的原因。

因此,如果要将unicode数据发送到流,请使用.write()方法而不是print

代码语言:javascript
复制
>>> sys.stdout.write(u'1\n')
1
>>> codecsout.write(u'1\n')
1
>>> sys.stdout.write(u'1\n')
1
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14205548

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档