【问题标题】:Python raw_input messing up string concatenationPython raw_input 搞乱了字符串连接
【发布时间】:2013-12-03 18:16:58
【问题描述】:

我正在尝试在 Python 中做一些相对简单的事情,但我很惊讶这对于它应该多么简单却不起作用。

我在这里只是想连接三个简单的字符串。在以下所有情况下,在 raw_input 输入的输入都是 "abc"

proj = raw_input("Name of project: ")
print proj
ProjRegex = 'test1' + proj + 'test2'
print ProjRegex

产量:

abc
test2abc

案例 2

proj = raw_input("Name of project: ")
print proj
ProjRegex = 'test1%stest2' % (proj)
print ProjRegex

产量:

abc
test2abc

请注意,在这两种情况下,它都用 test2 代替了 test1,而不是像预期的那样打印 "test1abctest2"

然后我注意到如果我根本没有使用 raw_input,如果我说:

proj = "abc"
ProjRegex = 'test1' + proj + 'test2'

然后它按预期运行。

raw_input() 中是否发生了想要进行字符串替换的事情?我的理解是它需要键盘输入,删除换行符,然后作为字符串返回。

【问题讨论】:

  • 我不确定你是如何得到你看到的输出的,但这不是你将这段代码作为 Python 脚本运行时得到的输出。我看到"test1abctest2" 很好。就好像在\r 回车中添加了一些东西。
  • 我敢打赌,如果你添加了print repr(proj),你会看到输入是abc\r
  • 如果发生这种情况是因为您在 Windows 上,您应该适当地重新标记问题。
  • 备案:OP很好地解释了问题,提供了输入和预期的输出,并且有一个真实的问题。我不明白为什么这应该被如此低估。
  • @StevenRumbalski:我需要深入了解 CPython 如何处理这个问题的来龙去脉,在 OP 给我们提供更多细节之前我不会开始这样做;具体来说,这里使用的是什么解释器、什么版本以及什么 shell 或控制台。

标签: python windows string concatenation raw-input


【解决方案1】:

您在 Windows 下运行,对吗?您输入的字符串以 DOS 行结尾结束,因此 ProjRegextest1abc\rtest2 组成。打印时,\r 将光标移动到行首,此时test2 将覆盖test1

【讨论】:

  • 这里同上:Python 以文本模式打开 sys.stdin,这意味着换行约定会自动转换为 \n。这里的\r不正常
  • 是的,我认为 Python 应该自动处理这个问题。我同意\r 的出现方式是个谜。
【解决方案2】:

这一定是与尾随 \r 相关的问题... 试试这个:

'test1' + proj.rstrip() + 'test2'

解释:

您的连接字符串在中间包含\r。打印时,控制台确实将开头打印为test1...,但当遇到\r 时,它会将"carriage-returns" 打印到行首,并用其余部分覆盖它。

Further reading about newlines

【讨论】:

  • Python 以文本模式打开sys.stdin,这意味着换行约定会自动转换为\n。这里的\r不正常
  • 我认为你是正确的,这是由尾随 '\r' 引起的。但是,我不确定他是如何以字符串结尾的'\r' 结尾的。他还需要弄清楚这一点。它可能在未显示的代码中。
  • 是的,print proj和print repr(proj)的输出分别是abc 'abc\r' 我用的是Python2.7,在Windows7上运行cmd.exe。所以,确实, \r 被放在字符串的中间,正如 shx2 解释得很好。我没有遗漏其他代码。确实,使用 proj.rstrip() 有效,谢谢!我仍然不确定为什么 \r 没有被翻译成 \n。就我而言,我很高兴。谢谢大家。
  • 我很高兴提供回答新问题所需的信息,为什么我的 sys.stdin 没有按预期工作。我只是使用默认的 Python2.7 安装,据我所知我没有替换 sys.stdin 调用。我什至怎么检查?谢谢。
【解决方案3】:

您能否验证您是否设置了PYTHONUNBUFFERED 环境变量?在 Windows 上设置时,您肯定会遇到 raw_input 返回\r 的问题。你可以阅读更多关于它的信息here

【讨论】:

    猜你喜欢
    • 2013-04-24
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    • 2012-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多