有人可以解释为什么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
答案 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