防止Python打印换行符

3 投票
4 回答
12109 浏览
提问于 2025-04-15 20:38

我有一段Python代码

inputted = input("Enter in something: ")
print("Input is {0}, including the return".format(inputted))

运行后会输出

Enter in something: something
Input is something
, including the return

我不太明白发生了什么;如果我使用的变量不依赖于用户输入,格式化后就不会有换行。我怀疑Python在我按回车键时可能把换行符当成输入了。

我该怎么做才能确保输入不包含任何换行符,这样我就可以把它和其他字符串或字符进行比较?(比如 something == 'a'

4 个回答

3

如果你只想去掉最后一行的换行符,可以使用 rstrip。
inputted.rstrip ("\r\n")

4

你的问题其实是出在Eclipse上。如果你使用的是PyDev,我可以复现这个问题。当你在Eclipse控制台输入内容时,问题就像你描述的那样出现了。但是如果直接用Python 3.1.1解释器执行同样的脚本,inputted就不会包含换行符。

我查了一下Python的源代码,发现input()在标准输入是交互式的时候(也就是在终端或提示符下),会使用GNU readline,但如果需要的话,它会退回到标准输入对象的.readline()方法。然后,如果readline的结果以\n结尾,这个字符会被去掉。注意:在退回的情况下,这里没有处理CR-LF或LF-CR的情况!

所以我写了一个小脚本来看看实际发生了什么:

import sys
from io import StringIO

for stdin in [sys.stdin, StringIO("test\r\ntest\r\n")]:
    sys.stdin = stdin 

    print("readline returns this: " + repr(sys.stdin.readline()))

    inputted = input("Enter in something: ")
    print("inputted: " + repr(inputted))

    print("inputted is printed like this: --> {0} <--".format(inputted))

这个脚本首先在正常的标准输入(控制台或Eclipse控制台)下执行代码,然后在准备好的标准输入中包含文本test\r\ntest\r\n

试着在Eclipse中运行这个脚本——你必须输入一个字符串两次。结论是:在Eclipse控制台按下回车会产生CR-LF("\r\n")。在Eclipse控制台打印"\r"会跳到下一行。

另一方面,在Windows控制台运行时会产生预期的输出:input()返回的字符串末尾没有换行符,因为(我猜)使用了GNU readline。使用准备好的标准输入StringIO("test\r\n")input()的结果是"test\r",和在Eclipse中一样(虽然没有打印成换行)。

希望这些都能让你明白……但我仍然不知道这是否是Eclipse的预期行为。

7

你说得对,inputted里面确实包含了换行符。要去掉它,你可以用 strip("\r\n") 这个方法,这样就能把末尾的换行符去掉:

print("Input is {0}, including the return".format(inputted.strip("\r\n")))

如果 inputted 末尾没有换行符,这样做也不会有任何问题,但如果有的话,它会把这些换行符去掉。所以无论 inputted 是用户输入的还是其他来源的,你都可以这样用。

如果你想完全去掉文本中的所有换行符,可以使用 inputted.replace("\r\n", "") 来删除所有的换行符。

撰写回答