Python 3解释器为每次写入打印长度到标准输入

时间:2016-09-20 10:54:35

标签: python anaconda

关于这种行为有几个问题:

>>> import sys
>>> sys.stdout.write("aaaa")
aaaa4
>>>

我明白那里发生了什么。我不明白的是在我的情况下发生了什么:无论我打开哪个文件,每当我使用其.write方法时,数据的长度都会写入控制台/ stdout。< / p>

>>> with open("garbage.file", "wb") as f:
...     for x in range(4):
...         f.write(b"xyz")
...
3
3
3
3
>>> with open("garbage.file", "rb") as f:
...     assert f.read() == b"xyzxyzxyzxyz"
...
>>>

但是,当我让python将其作为脚本运行时,这种行为会发生 not

D:\>type CON > test.py
with open("garbage.file", "wb") as f:
    f.write(b"xyz")

^Z

D:\>python test.py

D:\>type garbage.file
xyz
D:\>

在Windows命令提示符(“普通”cmd或“Anaconda Prompt”)上使用的任何新的Python 3.5解释器都会发生这种情况。

>>> import sys
>>> sys.version
'3.5.2 |Anaconda 4.1.1 (64-bit)| (default, Jul  5 2016, 11:41:13) [MSC v.1900 64 bit (AMD64)]'
>>>

我以前从未见过这种行为,看起来也不应该发生。可能是什么原因?我该如何解决?

1 个答案:

答案 0 :(得分:4)

这似乎是这个问题的重复:sys.stdout.write in python3 adds 11 at end of string

这解释了.write()返回写入文件后写入的字符数。这解释了为什么你在翻译中看到它而不是你创建的文件。

编辑:显示解释器显示返回值的示例和python可执行文件忽略它们。

>>> def show(string):
...     print(string)
...     return(len(string))
... 
>>> show('foobar')
foobar
6

现在,如果我创建的文件具有完全相同的内容,我会得到:

$ python show.py 
foobar

这是因为python可执行文件不显示返回值,而解释器则显示。