防止Python打印换行符

3

我有这段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'


你使用的是哪个操作系统/Python版本?我无法在Win XP上使用Python 3.1.1重现这个问题。 - AndiDog
@AndiDog:Python 3.1.1,Windows 7与Eclipse。 - wrongusername
虽然离题了,但如果打印调用以"the return"结尾,输出应该以"the return"而不是"the newline"结尾。 - None
@None-哇!你说得对 :) - wrongusername
可能是如何在Python中打印而不带换行或空格?的重复问题。 - Seth Battin
4个回答

7

您是正确的 - inputted 中包含了一个换行符。要将其删除,您可以调用strip("\r\n") 来从末尾删除换行符:

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

如果 inputted 没有换行符,这不会造成任何问题,但是会删除所有的换行符,因此无论 inputted 是否是用户输入,都可以使用此方法。

如果您不想在文本中出现任何换行符,可以使用 inputted.replace("\r\n", "") 来删除所有换行符。


谢谢!不幸的是,无论是在单独的一行还是其他情况下,strip和replace都对我没有起作用。 - wrongusername
1
尝试剥离 '\n' 而不是 '\r'。当脚本期望单独的 '\n' 时,您的终端可能会发送 '\r\n'。 - Jacek Konieczny
有趣的是,Python通常只使用"\n"来删除所有换行符,或者至少我认为它是这样的(http://www.python.org/dev/peps/pep-0278/)。我将编辑以剥离`\r\n`,这应该可以解决问题。 - Daniel G
3
nit: 在这里,推荐使用rstrip()而不是strip():strip()会从两端删除。虽然你知道在开头没有多余的换行符,但为什么不说清楚呢? - Darius Bacon

4
您的问题实际上是Eclipse引起的。假设您使用PyDev,我能够重现这个问题。在Eclipse控制台中输入一些内容时,会出现与您的问题描述相同的问题。但是当直接使用Python 3.1.1解释器执行完全相同的脚本时,inputted不包括换行符。
我调查了Python源代码,并发现input()如果stdin是交互式的(即TTY或提示符,无论您如何称呼它),则使用GNU readline,但必要时会回退到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控制台)执行代码,然后使用准备好的stdin包含文本test\r\ntest\r\n

尝试在Eclipse中运行脚本-您必须输入两次字符串。结论:在Eclipse控制台中按Enter键将产生CR-LF("\r\n")。在Eclipse控制台中打印“\r”将跳到下一行。

另一方面,在Windows控制台中运行它将产生预期的输出:input()返回一个没有换行符的字符串,因为(我猜)使用了GNU readline。使用准备好的stdin StringIO("test\r\n")input()结果是“test\r”,就像在Eclipse中一样(尽管未打印为新行)。

希望这一切都有意义……但我仍然不知道这是否是Eclipse的预期行为。


该死的Eclipse :) 我想我会切换回Netbeans,但是我无法在Netbeans中正确运行Python 3单元测试(只能运行Jython 2.5单元测试)。感谢您的答复! - wrongusername

3

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


2
inputted = inputted.strip()

编辑:如上所述,这将删除开头和结尾的所有空格。去除只有结尾换行符的方法如下:

import re
inputted = re.sub("[\n\r]+$", "", inputted)

1
这将删除所有空格 - 包括行尾,但不包括空格和制表符。也许是正确的做法 - 也可能不是。 - user180247
@Steve 确认。已编辑以反映此事。 - Jakob Borg
错误,实际上 - 第一个“不”是怎么进去的?该死! - user180247

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接