我在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'
)
答案 0 :(得分:7)
你是对的 - inputted
中包含换行符。要删除它,您只需拨打strip("\r\n")
即可从最后删除换行符:
print("Input is {0}, including the return".format(inputted.strip("\r\n")))
如果inputted
最后没有换行符,则不会导致任何问题,但会删除任何换行符,因此无论inputted
是否为用户输入,您都可以使用此换行符。
如果您根本不想在文本中添加任何换行符,则可以使用inputted.replace("\r\n", "")
删除所有换行符。
答案 1 :(得分:4)
您的问题实际上是Eclipse。假设您使用PyDev,我能够重现问题。在Eclipse控制台中输入内容时,会出现问题中描述的问题。但是当使用Python 3.1.1解释器直接执行相同的脚本时,inputted
不包含换行符。
我调查了Python源代码并发现input()
使用 GNU readline 如果stdin是交互式的(即TTY或提示符,但是你想要调用它),但是又回到了必要时stdin对象的.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))
它首先使用普通的stdin(控制台或Eclipse控制台)执行代码,然后使用包含文本test\r\ntest\r\n
的准备好的stdin执行。
在Eclipse中尝试并运行脚本 - 您必须输入两次字符串。结论:在Eclipse控制台中按Enter键将生成CR-LF(“\ r \ n”)。在Eclipse控制台中打印“\ r \ n”将跳转到下一行。
另一方面,在Windows控制台中运行它会产生预期的输出:input()
返回一个没有换行符的字符串,因为(我猜)使用GNU readline。使用准备好的stdin StringIO("test\r\n")
,input()
结果与Eclipse中的“test \ r”相同(尽管不是作为换行符打印)。
希望这一切都有意义......但我仍然不知道的是,这是否是Eclipse的预期行为。
答案 2 :(得分:3)
如果您只想剥离最后一行结尾,可以使用rstrip
inputted.rstrip ("\r\n")
答案 3 :(得分:2)
inputted = inputted.strip()
编辑如上所述,这将在开始和结束时终止所有空白。一种摆脱只有尾随换行符的方法是:
import re
inputted = re.sub("[\n\r]+$", "", inputted)