【问题标题】:what is \r in python 3.5.2? (pycharm & Mac)python 3.5.2 中的 \r 是什么? (pycharm & Mac)
【发布时间】:2016-12-23 08:31:05
【问题描述】:

我在 mac 的 python 3.5.2 中运行代码。 (pycharm)

当我运行 print("abcz\rdef") 时,我期待得到 defz,但我得到了 def... 现在发生了什么?

【问题讨论】:

  • @YOU \r 是 Mac 的换行符,而不是 Windows。 Windows 使用\r\n
  • 知识已过时
  • @YOU 引用 Windows 总是错误的。它从未使用过\r
  • 告诉我哪个 OS X 使用\r
  • @jin,试试 sys.stdout.write("abcz\rdef"),我猜 pycharm 试图与你的输入交互。

标签: python-3.x


【解决方案1】:

ASCII 字符 \r aka. 0x0D aka. 13 aka. @987654326 @:**
首先,它不是 Python 属性,而是常见的 ASCII 码。这意味着几乎所有的编程语言对于 字符 \r 的行为都是相同的。
注意单数:\rONE 字符。


回车

这样说,它对应Carriage Return (CR),基本上是回到了行首。

在您的情况下,您说“请打印 abcz 然后回到开头并打印 def”。 “回到开头”意味着您将覆盖当前行。所以def覆盖abcz保持原样,最后给你defz

print("a\rb") # => b
print("abcdef\rLOL") #=> LOLdef
#etc...

换行符:LF vs CR+LF:

事实上,换行符的处理方式并不完全相同,具体取决于您的操作系统。大多数操作系统将使用单个\n 换行,而Windows 使用\r\n,这可能会导致奇怪的问题(参见下面的示例)。

引用wikipedia:

LF:    Unix and Unix-like systems (Linux, OS X, FreeBSD, Multics, AIX, Xenix, etc.), BeOS, Amiga, RISC OS, and others[1]
CR+LF: Microsoft Windows, DOS (MS-DOS, PC DOS, etc.), DEC TOPS-10, RT-11, CP/M, MP/M, Atari TOS, OS/2, Symbian OS, Palm OS, Amstrad CPC, and most other early non-Unix and non-IBM OSes
CR:    Commodore 8-bit machines, Acorn BBC, ZX Spectrum, TRS-80, Apple II family, Oberon, the classic Mac OS up to version 9, MIT Lisp Machine and OS-9
RS:    QNX pre-POSIX implementation
0x9B:  Atari 8-bit machines using ATASCII variant of ASCII (155 in decimal)
LF+CR: Acorn BBC and RISC OS spooled text output.

常见问题:
我猜最常见的问题是在 Linux 上逐行读取 Windows 文本文件。作为一名 Linux 开发人员,您会期望行以 \n 结尾,并且假设您想要连接句子,您将只删除 \n 并在其中留下危险的 \r

示例:我们想要连接两个文件中的每个句子。

# Open our two files
fn1="file1.txt"
fn2="file2.txt"

f1=open(fn1, 'r')
f2=open(fn2, 'r')

while True:
   # Read 1 line in each
   l1 = f1.readline()
   l2 = f2.readline()

   # Check lines are not empty, or break
   if not l1 or not l2:
      break

   # Remove new lines
   l1 = l1.replace('\n', '')
   l2 = l2.replace('\n', '')

   # Print the result
   print("%s %s" % (l1, l2))

在上面的例子中,如果l1 来自Windows,你只会看到l2 被打印出来。 (实际上它被覆盖了,所以如果l1l2 更长,你会看到l2+ l1 的结尾)


示例: 一个很酷的例子是让计数器增加一个数字而不打印新行,试试这个:

for i in range(100000):
   print("\r%d" % i, end="")

pltrdy

【讨论】:

  • \rMac 的换行符,而不是 Windows
  • 我刚才说 Windows 使用的是 CRLF,而不是 CR,不是吗?
【解决方案2】:

感谢您回答我的问题。当我尝试您的示例时: (打印("a\rb") # => b print("abcdef\rLOL") #=> LOLdef

我仍然得到 b 和 LOL 的答案.... 我不知道为什么它一直在发生... 顺便说一句,我正在使用 pycharm...请告诉我如何解决它...

【讨论】:

    猜你喜欢
    • 2020-12-21
    • 1970-01-01
    • 2019-06-24
    • 2022-06-21
    • 1970-01-01
    • 2014-08-07
    • 2017-01-09
    • 2016-01-15
    • 2018-03-05
    相关资源
    最近更新 更多