这代表什么?

3

'\r' 是什么意思?它是用来做什么的?我之前从未见过它,现在它让我感到很头痛。它似乎没有任何作用,因为 'a\ra' 输出的结果是 'aa',但它与字符串 'aa' 并不相同。我正在使用 Python 2.6。


提供给其他谷歌员工的信息 - 在Windows上,使用subprocessing模块调用进程时,从stdout读取时会得到一个'\r',但在进程内部从stdin读取时则没有。 - Michael David Watson
我找到的最佳答案在这里:https://dev59.com/UWUp5IYBdhLWcg3wNVhb - Nader Belal
4个回答

10

这是来自打字机时代的一个旧控制字符。

它表示“回车符”,在那个时候,当你按下“回车”键,你会进入下一行,然后打印头(即回车)会移回到该行开头。

随着计算机的出现,不同的操作系统做了不同的选择来表示新行。

在Windows中,你有“\r\n”(回车符+换行符)。

在类UNIX系统中,你只需要使用“\n”(无需回车,新行已经隐含包含回车的意义)。

在旧的Mac OS中,你只有“\r”。

现在,除了用于表示新行(或者我不知道其他用途),它已经不再使用了。


7
偶尔会使用以下语句在同一行上显示更新进度指示器: printf("1%%"); fflush(stdout); sleep(1); printf("\r2%%"); 第一个 printf 在行末留下光标。 第二个 printf 使用 \r 将光标移回行首,然后用 2% 覆盖 1% - John Kugelman

8

对于我(在Mac OS X 10.5终端应用程序上,Python 2.6.5):

>>> print 'a\ra'
a

或者举个更好的例子:
>>> print 'longstring\rshort'
shorttring

换句话说,\r会将光标“移到行首”(而不启动新的行),因此'short'会“覆盖”'longstring'的开头。

这种效果适合在长时间操作期间向用户显示单行“当前状态”的更新 - 使用带有尾随逗号的print '\rupdate' 来避免发出换行符以通过覆盖上一个状态来更新状态。当然,您需要确保每个更新的字符串至少与之前的字符串一样长(只需用空格填充即可)。

请注意,其他回答者已经注意到他们的平台上有不同的视觉效果(您自己也看到了\r消失而没有效果,这在我的经验中是前所未有的),因此这种提供更新的好方法无法在每个平台上很好地运行!-)


1

这是回车符的转义字符。在我的Windows控制台上,print 'a\ra'的结果是...

a
a

...被打印到标准输出(stdout)。

这里是一个所有有效转义字符的列表。

  • \newline - 忽略
  • \\ - 反斜杠 ()
  • \' - 单引号 (')
  • \" - 双引号 (")
  • \a - ASCII 响铃符 (BEL)
  • \b - ASCII 退格符 (BS)
  • \f - ASCII 换页符 (FF)
  • \n - ASCII 换行符 (LF)
  • \N{name} - Unicode 数据库中名称为 name 的字符 (仅限 Unicode)
  • \r - ASCII 回车符 (CR)
  • \t - ASCII 水平制表符 (TAB)
  • \uxxxx - 具有 16 位十六进制值 xxxx 的字符 (仅限 Unicode)
  • \Uxxxxxxxx - 具有 32 位十六进制值 xxxxxxxx 的字符 (仅限 Unicode)
  • \v - ASCII 垂直制表符 (VT)
  • \ooo - 具有八进制值 ooo 的字符
  • \xhh - 具有十六进制值 hh 的字符

在Windows上运行print 'a\ra'只会输出一个单独的a。因为回车符没有换行符,所以第二个a会覆盖第一个。 - FogleBird
1
这取决于您的控制台如何解释控制序列,我想。如果您正在调试,则始终使用repr是一个很好的论点,并且在可能的情况下尽量避免控制字符。 - Chris B.

0

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