read()python 2和python 3之间的差异

时间:2017-01-19 04:44:48

标签: 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的预期十进制数。据我所知。

1 个答案:

答案 0 :(得分:8)

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

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

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

如果要在Python 3上禁用通用换行符处理,请传递io.open open的参数(用于通用识别,以便在读取/迭代时断行,但不会转换行结尾)或open(例如)表示只有newline=''被识别为一行结束,并且再次没有执行行结尾的转换。正确处理某些文件格式需要传递newline='\n'; \n模块执行自己的行结束处理,newline=''确保在到达csv读者之前没有信息丢失。