3
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

失败:

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

它也失败print(3, file=ioout)__future__

print知道如何与io模块交谈?

4

2 回答 2

2

显然不是。即使你给它一个明确的 Unicode 字符串,它也不起作用。

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

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

>>> from __future__ import print_function
>>> print(unicode(3), file=ioout)
3
于 2013-01-07T23:25:52.133 回答
0

print语句隐式调用__str__它打印的每一件事。sys.stdout是一个字节流,所以发送它就可以了strcodecs.getwriter是一个旧的 Python API,所以我猜它只是隐式转换strunicodePython 2.x 传统上所做的。但是,新io模块严格要求转换strunicodePython 3.x,这就是它抱怨的原因。

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

>>> sys.stdout.write(u'1\n')
1
>>> codecsout.write(u'1\n')
1
>>> sys.stdout.write(u'1\n')
1
于 2013-01-08T02:17:26.417 回答