使用以下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 的预期十进制数,据我所知.
Python 3open
默认为通用换行模式(newline=None
),而Python 2open
仅在模式字符串包含时启用通用换行模式U
.
在通用换行模式中,序列\r
(旧Mac),\n
(UNIX)或\r\n
(DOS/Windows)都被识别为换行符,并自动转换为\n
行尾,具有一致的表示以简化字符串操作.
如果你想在Python 2中使用通用换行符,你可以使用模式字符串来启用或使用io.open
它,这几乎与Python 3的内置相当open
(io.open
在Python 3上只是另一种说法open
).
如果要在Python 3上禁用通用换行处理,请传递open
一个参数newline=''
(用于通用识别,以便在读取/迭代时断行,但不转换行结尾)或newline='\n'
(例如)表示仅\n
被识别为行结束,再次,不执行行结尾的转换.传递newline=''
需要妥善处理某些文件格式; 该csv
模块进行处理结束自己的路线,并newline=''
确保它到达之前,不会丢失任何信息csv
的读者.