【问题标题】:read() differences between python 2 and python 3python 2和python 3之间的read()差异
【发布时间】:2017-06-03 16:30:10
【问题描述】:

使用以下 MWE:

with open('a','w') as f:
    f.write('\r')
with open('a','r') as f:
    print(ord(f.read()))

我得到以下输出:

$ python2 test.py 
13
$ python3 test.py 
10

你能解释一下为什么吗?据我所知,13\r 在 ascii 和 UTF-8 中的预期十进制数。

【问题讨论】:

  • ord('\n')会给你10个。ShadowRanger已经解释了原因。

标签: python python-3.x newline python-2.x line-endings


【解决方案1】:

Python 3's open 默认为通用换行模式(newline=None),而Python 2's open 仅在模式字符串包含U 时启用通用换行模式。

在通用换行模式下,序列\r(旧Mac)、\n(UNIX)或\r\n(DOS/Windows)都被识别为换行符,并自动转换为\n,因此行尾有用于简化字符串操作的一致表示。

如果你想在 Python 2 中使用通用换行符,你可以使用模式字符串来启用它,或者使用use io.open,它几乎完全等同于 Python 3 的内置 openio.open 在 Python 3 上是只是另一种说法open)。

如果您想在 Python 3 上禁用通用换行符处理,请传递 open 参数 newline=''(用于通用识别,以便在读取/迭代时断行,但不转换行尾)或 @987654338 @(例如)表示只有\n 被识别为一个行尾,同样,不执行行尾的转换。需要通过newline='' 才能正确处理某些文件格式; csv 模块执行自己的行结束处理,newline='' 确保在到达csv 阅读器之前不会丢失任何信息。

【讨论】:

  • @noleti:我们永远,永远不会结束它。我希望在 2010 年之前创建的大多数语言或基于 2010 年之前的语言仍然特别处理 \r 的情况下进入我的坟墓,并且相当多的新语言继续出于习惯这样做。无论如何,\r 并不常用。如果人们在文本输入中看到它,它要么是重定向到文件的 hacky 控制台控件,要么是用作换行符;无论哪种方式,在大多数情况下,将其视为换行符比忽略它更合理。
猜你喜欢
  • 2011-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-22
相关资源
最近更新 更多