在Mac与Windows上处理Python中的\r\n与\n换行符
我有一个Python脚本,在Windows电脑上运行和在Mac上运行时,输出结果不一样。经过深入调查,我发现这是因为Python在Mac上读取文件时,读取到的换行符是\r\n
,而在Windows上,\r
这个部分不见了。
所以,如果我把脚本中的每个\n
都改成\r\n
,在Mac上就能正常工作。但是这样一来,它在Windows电脑上就不行了。
有没有简单的方法来解决这个问题呢?
5 个回答
在Python 3中,Open()
方法有一个叫做 newline
的参数:
这个
newline
参数控制了通用换行模式的工作方式(它只适用于文本模式)。它可以是None、''、'\n'、'\r'和'\r\n'。具体作用如下:当从输入流读取数据时,如果
newline
是None,通用换行模式就会启用。输入中的行可以以'\n'、'\r'或'\r\n'结尾,这些都会在返回给调用者之前被转换成'\n'。如果newline
是'',通用换行模式仍然启用,但行结束符会原样返回给调用者,不进行转换。如果newline
是其他合法值,输入行只会以指定的字符串结束,行结束符也会原样返回。当向输出流写入数据时,如果
newline
是None,写入的任何'\n'字符都会被转换为系统默认的行分隔符,也就是os.linesep。如果newline
是''或'\n',则不会进行任何转换。如果newline
是其他合法值,写入的任何'\n'字符都会被转换为指定的字符串。
以前使用的U
模式已经被弃用,取而代之的是这种新的方式。
'U' 通用换行模式(已弃用)
不同的操作系统对“换行”的表示方式是不同的。比如,Windows系统用的是 \r\n,Unix系统用的是 \n,老款的Mac电脑用的是 \r,还有一些系统用的是 \n\r。
在Python 3中,当你以文本模式打开一个文件时,它会把所有的换行符都转换成 '\n',这样就处理完了。
infile = open("filename", 'r')
文本模式是默认的,也就是说如果你什么都不说,它就是文本模式。不过,明确说明总是更好:
infile = open("filename", 'rt')
如果你不想让换行符被转换,可以以二进制模式打开文件:
infile = open("filename", 'rb')
在Python 2中情况就不一样了。那里默认只在Windows上进行这种转换。如果你想在其他平台上也进行转换,可以加上一个叫做“通用换行标志”的选项:
infile = open("filename", 'rU')
不过你提到你在用Python 3,在这个版本中,所有平台的文本模式下都会进行转换,所以加上U标志是没有区别的。
'U'
模式:
Python 2:
我想这可能跟你读取的内容有关,但内置的 open() 函数有一个 'mode' 参数。如果你把 'U' 作为模式传进去,Python 2 会以一种跨平台的方式自动处理换行符。这要求 Python 是用支持通用换行符的方式构建的,不过你可以试试看!
https://docs.python.org/2/library/functions.html#open
Python 3:
在 Python 3 中,'U'
模式是默认的行为,正如文档所解释的那样:
还有一个额外的模式字符
'U'
,现在已经没有效果,被认为是过时的。它之前用于在文本模式下启用 通用换行符,而这个功能在 Python 3.0 中已经成为默认行为。有关更多细节,请参考 换行 参数的文档。