使用以下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
的预期十进制数。据我所知。
答案 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
读者之前没有信息丢失。