【问题标题】:Prevent python from printing newline防止python打印换行符
【发布时间】:2011-01-29 21:02:30
【问题描述】:

我在 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:Python 3.1.1,带有 Eclipse 的 Windows 7
  • 题外话,但是如果打印调用以“return”结尾,那么输出不应该以“return”结尾,而不是“the newline”。
  • @None-whoopw!你是对的:)

标签: python input newline user-input


【解决方案1】:

您是正确的 - inputted 中包含换行符。要删除它,您只需调用 strip("\r\n") 从末尾删除换行符:

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

如果inputted 末尾没有换行符,这不会导致任何问题,但会删除其中的任何内容,因此无论inputted 是否是用户输入,您都可以使用它。

如果您根本不希望文本中有任何个换行符,您可以使用inputted.replace("\r\n", "") 删除所有换行符。

【讨论】:

  • 谢谢!不幸的是,无论是在单独的行还是以其他方式,strip 和 replace 都不适合我。
  • 然后尝试剥离 '\r' 而不是 '\n'。当脚本只需要 '\n' 时,您的终端可能会发送 '\r\n'。
  • 有趣 - Python 通常只用"\n" 删除所有换行符,或者至少我认为它确实如此(python.org/dev/peps/pep-0278)。我将进行编辑以剥离 \r\n,这两者都应该做到。
  • 一个 nit: rstrip() 在这里比 strip() 更受欢迎: strip() 从两端删除。确实,您知道开头没有多余的换行符,但为什么不说出您的意思呢?
【解决方案2】:

您的问题实际上是 Eclipse。假设您使用 PyDev,我能够重现该问题。在 Eclipse 控制台中输入内容时,会出现问题中所述的问题。但是当使用 Python 3.1.1 解释器直接执行相同的脚本时,inputted 不包含换行符。

我调查了 Python 源代码,发现 input() 使用 GNU readline 如果标准输入是交互式的(即 TTY 或提示,但你想调用它),但回退到 @ 987654323@stdin 对象的方法(如有必要)。然后,如果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 控制台中按 Enter 将产生 CR-LF ("\r\n")。在 Eclipse 控制台打印“\r”会跳转到下一行。

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

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

【讨论】:

  • 该死的 Eclipse :) 我想我会切换回 Netbeans,但我无法让 Python 3 单元测试在 Netbeans 中正常工作(只能运行 Jython 2.5 单元测试)。感谢您的回答!
【解决方案3】:

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

【讨论】:

    【解决方案4】:
    inputted = inputted.strip()
    

    编辑:如前所述,这将在开始和结束处杀死所有空格。摆脱尾随换行的一种方法是:

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

    【讨论】:

    • 这将删除所有空格 - 包括行尾,但不包括空格和制表符。也许正是正确的做法——但也许不是。
    • @Steve True。编辑以反映这一点。
    • false,实际上——第一个“不”是怎么进来的?该死!
    猜你喜欢
    • 2016-01-06
    • 2011-11-07
    • 2010-09-20
    • 2015-04-05
    • 2015-06-17
    • 2015-12-29
    • 1970-01-01
    • 2020-05-19
    相关资源
    最近更新 更多