使用以下 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
是 ascii 和 UTF-8 中 \r
的预期十进制数。
最佳答案
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 的内置 open
(Python 3 上的 io.open
只是 open
的另一种表达方式) .
如果您想在 Python 3 上禁用通用换行符处理,请向 open
传递一个 newline=''
的参数(用于在阅读时换行的通用识别)/迭代,但没有行尾的翻译)或 newline='\n'
(例如)表示只有 \n
被识别为行尾,并且同样,不执行行尾的翻译。传递 newline=''
是正确处理某些文件格式所必需的; csv
模块执行自己的行结束处理,newline=''
确保在信息到达 csv
阅读器之前不会丢失任何信息。
关于python - python 2 和 python 3 之间的 read() 区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41733922/