python3中的sys.stdout.write在字符串末尾添加了11

时间:2015-09-15 02:03:36

标签: python

有人可以解释为什么sys.stdout.write()会将11附加到我的字符串中吗?

$ python3
Python 3.4.3+ (default, Jul 28 2015, 13:17:50) 
[GCC 4.9.3] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> x = 'hello'
>>> y = 'world'
>>> msg = ''
>>> import sys
>>> msg += x
>>> msg += '\n' + y 
>>> msg
'hello\nworld'
>>> sys.stdout.write(msg)
hello
world11
>>> print(msg)
hello
world

2 个答案:

答案 0 :(得分:6)

它不会附加到书面字符串中。 11这里是sys.stdout.write()的返回值,它是写入的字符数。

请参阅write

  

将字符串s写入流并返回写入的字符数。

它类似于:

>>> def foo():
...     print('something', end='')
...     return 42
...
>>> foo()
something42

答案 1 :(得分:2)

一个更常见的问题

这是一个很好的问题,但我认为这不是最笼统的问题。问题Python 3 interpreter prints length to standard input for every write,如果有人尝试编写的字符串恰好与11的长度不同,则更容易查找。当我说“易于查找”时,它表示它在搜索中更容易显示。另外,我提到的问题还包括“如何解决此问题?”的另一个问题。

这两篇文章中的问题都是解释器与脚本问题。从技术上讲,Python外壳程序(至少使用直接来自python.org的Python和默认设置)使用Read-eval-print loop(REPL),您可以在上一个链接中了解到。更简单(正如@Kieran在我提到的其他帖子的答案中所说的那样)

  

[T] python可执行文件不显示返回值,而解释器显示。


如何修复

我认为这是shell与脚本问题的充分描述。但是,我想解决“如何使其消失?”的问题。这里。首先,我认为偶然发现此问题的人可能会感到奇怪,特别是如果他们使用交互式外壳进行开发。其次,我无法回答第二,“如何?”问题,另一则帖子被标记为重复。

我将在其中重复一些带有结果的代码,主要是因为这样做更快。正如@Yu_Hao所指出的那样,write的文档有助于解释该行为。

  

将字符串s写入流并返回写入的字符数。

解决此问题的简单方法是将返回值分配给变量。 (无论如何,这都是一个好习惯,因为最好知道另一个脚本调用的脚本是否成功完成。)以下一系列命令显示了问题,原因,解决方案以及对该解决方案的进一步使用来确保它工作。

(Windows) >python
(*NIX)    $ python3
Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [<system-dependent-string>] on <system>
Type "help", "copyright", "credits" or "license" for more information.
>>> with open("garbage.file", "wb") as f:
...   for x in range(4):
...     f.write(b"xyz")
...
3
3
3
3
>>> with open("garbage.file", "wb") as f:
...   for x in range(4):
...     catch_ret_val = f.write(b"xyz")
...
>>> # Check it.
...
>>> with open("garbage.file", 'rb') as f:
...   f.read()
...
b'xyzxyzxyzxyz'
>>>
>>> # Note a snag if you want to use another way to check it.
...
>>> import os
(Windows) >>> os.system("type garbage.file")
xyzxyzxyzxyz0
(*NIX)    >>> os.system("cat garbage.file")
xyzxyzxyzxyz0
>>>
>>> # Oops, the return value of zero gets added on. 
...
>>> # We can use the same solution with the return value.
(Windows) >>> os_ret = os.system("type garbage.file")
xyzxyzxyzxyz>>>
(*NIX)    >>> os_ret = os.system("cat garbage.file")
xyzxyzxyzxyz>>>
>>>

事情看起来仍然不太好。文件末尾没有回车符和/或换行符。如果您想让事情更清洁...

(Windows) >>> os_ret = os.system("type garbage.file && echo(")
xyzxyzxyzxyz
(*NIX)    >>> os_ret = os.system("cat garbage.file && printf '\n'")
xyzxyzxyzxyz