为什么Python IDLE和控制台产生不同结果

3 投票
3 回答
1040 浏览
提问于 2025-04-16 09:14

我写了一个简单的Python脚本,用来把中文标点符号转换成英文标点。

import codecs, sys

def trcn():
    tr = lambda x: x.translate(str.maketrans(""",。!?;:、()【】『』「」﹁﹂“”‘’《》~¥…—×""", """,.!?;:,()[][][][]""''<>~$^-*"""))
    out = codecs.getwriter('utf-8')(sys.stdout)
    for line in sys.stdin:
        out.write(tr(line))

if __name__ == '__main__':
    if not len(sys.argv) == 1:
        print("usage:\n\t{0} STDIN STDOUT".format(sys.argv[0]))
        sys.exit(-1)
    trcn()
    sys.exit(0)

但是有些问题出在UNICODE上。我无法解决这个问题。错误信息是:

Traceback (most recent call last):
  File "trcn.py", line 13, in <module>
    trcn()
  File "trcn.py", line 7, in trcn
    out.write(tr(line))
  File "C:\Python31\Lib\codecs.py", line 356, in write
    self.stream.write(data)
TypeError: must be str, not bytes

之后,我在IDLE和控制台测试了out.write(),结果却不一样。我不知道为什么。

在IDLE中

Python 3.1.2 (r312:79149, Mar 21 2010, 00:41:52) [MSC v.1500 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> import sys,codecs
>>> out = codecs.getwriter('utf-8')(sys.stdout)
>>> out.write('hello')
hello
>>>

在控制台中

Python 3.1.2 (r312:79149, Mar 21 2010, 00:41:52) [MSC v.1500 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys,codecs
>>> out = codecs.getwriter('utf-8')(sys.stdout)
>>> out.write('hello')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python31\Lib\codecs.py", line 356, in write
    self.stream.write(data)
TypeError: must be str, not bytes
>>>

平台:Windows XP 英文版

3 个回答

-1

很明显,控制台的编码不是utf-8。你可以在控制台运行Python时,作为可选参数指定编码。具体的做法可以去Python的文档里查找。

1

IDLE会把标准输出(stdout)重定向到它自己的图形界面上。它似乎可以接受字节(bytes)和字符串(strings),而普通的标准输出只接受字符串。

你可以把字节转换成Unicode格式,或者直接把它打印到sys.stdout.buffer里。

6

你的编码输出是以字节的形式从编码器出来的,所以必须传递给 sys.stdout.buffer

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

我不太确定为什么你的代码在IDLE和控制台中的表现不同,但上面的内容可能会有所帮助。也许IDLE的 sys.stdout 实际上是期待字节而不是字符(希望它有一个 .buffer 也期待字节)。

撰写回答