防止Python打印换行符
我有一段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 个回答
如果你只想去掉最后一行的换行符,可以使用 rstrip。
inputted.rstrip ("\r\n")
你的问题其实是出在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的预期行为。
你说得对,inputted
里面确实包含了换行符。要去掉它,你可以用 strip("\r\n")
这个方法,这样就能把末尾的换行符去掉:
print("Input is {0}, including the return".format(inputted.strip("\r\n")))
如果 inputted
末尾没有换行符,这样做也不会有任何问题,但如果有的话,它会把这些换行符去掉。所以无论 inputted
是用户输入的还是其他来源的,你都可以这样用。
如果你想完全去掉文本中的所有换行符,可以使用 inputted.replace("\r\n", "")
来删除所有的换行符。