python - python 2 和 python 3 之间的 read() 区别

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

使用以下 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/

相关文章:

java - 新行和浏览器/操作系统兼容性

Python跳过函数中的参数

python - 当在另一个应用程序中嵌入 python 时,如何导入或调用子模块中的函数(即 scipy.optimize.nnls)?

python - 马里奥在pygame中跑过屏幕太快

django - 在django中用抽象用户覆盖用户模型的保存方法

c - 如何计算文件中的换行符,但不计算只是换行符的行?

python/pandas 线性规划/优化挑战

python - 如何从pandas中提取文本数据

python - 如何使用 Flask 设置可插入 View 的动态限制?

javascript - 如何在 Javascript 中创建一个新行?