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

时间:2011-01-05 00:54:01

标签: python windows macos python-2.x

我有一个python脚本,在Windows机器上运行时和在Mac上运行时提供不同的输出。在深入挖掘时,我发现这是因为当Python在Mac上读取换行符(从文件中读取)时,它会在\r\n中读取,而在某种程度上在Windows中,\r会消失。

因此,如果我将脚本中的每个\n更改为\r\n,那么它在Mac上运行正常。但如果我这样做,它将停止在Windows PC上运行。

有没有一种简单的方法可以解决这个问题?

5 个答案:

答案 0 :(得分:36)

不同的平台对“新行”有不同的代码。 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标志应该没有区别。

答案 1 :(得分:21)

我想这可能取决于你正在阅读的内容,但是内置的open()函数采用'mode'参数,如果你为模式传递'U',Python会处理换行符以透明的跨平台方式。它要求使用通用换行支持构建Python,但要测试它!

http://docs.python.org/library/functions.html#open

答案 2 :(得分:5)

在Python 3中,在open()中使用关键字参数“newline ='\ n'”在编写文本文件时使用指定的行分隔符。有关详细信息,请参阅:

https://pythonconquerstheuniverse.wordpress.com/2011/05/08/newline-conversion-in-python-3/

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

答案 3 :(得分:0)

在Windows上,如果我尝试使用两个(\ r或\ n)python中的任何一个来编写文件,它们都可以正常工作,在两种情况下都将它解释为换行符。使用" \ r \ n"时,它被解释为双行中断。(Windows上的Python 3)

答案 4 :(得分:0)

在Python 3中,Open()方法具有一个newline参数:

  

换行符控制通用换行符模式的工作方式(仅适用于   文字模式)。可以是“无”,“”,“ \ n”,“ \ r”和“ \ r \ n”。它作为   如下:

     

从流中读取输入时,如果换行为None,则为通用   换行模式已启用。输入中的行可以以'\ n','\ r'或   '\ r \ n',并且在返回之前将其转换为'\ n'   呼叫者,召集者。如果为”,则启用通用换行模式,但行   结束语未翻译地返回给呼叫者。如果有   其他合法值,输入行仅由给定终止   字符串,并且行尾未经翻译返回给调用方。

     

将输出写入流时,如果换行为None,则任何'\ n'   写入的字符将转换为系统默认行   分隔符,os.linesep。如果换行符是''或'\ n',则无需翻译   地点。如果换行符是其他任何合法值,则任何'\ n'   写入的字符将转换为给定的字符串。

不赞成使用旧的使用U模式说明符的方法,而推荐使用这种新方法。

  

“ U”通用换行模式(不建议使用)