在Mac与Windows上处理Python中的\r\n与\n换行符

42 投票
5 回答
99692 浏览
提问于 2025-04-16 09:25

我有一个Python脚本,在Windows电脑上运行和在Mac上运行时,输出结果不一样。经过深入调查,我发现这是因为Python在Mac上读取文件时,读取到的换行符是\r\n,而在Windows上,\r这个部分不见了。

所以,如果我把脚本中的每个\n都改成\r\n,在Mac上就能正常工作。但是这样一来,它在Windows电脑上就不行了。

有没有简单的方法来解决这个问题呢?

5 个回答

8

在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' 通用换行模式(已弃用)

46

不同的操作系统对“换行”的表示方式是不同的。比如,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标志是没有区别的。

25

'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 中已经成为默认行为。有关更多细节,请参考 换行 参数的文档。

https://docs.python.org/3/library/functions.html#open

撰写回答