繁体   English   中英

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

[英]Handling \r\n vs \n newlines in python on Mac vs Windows

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

因此,如果我将脚本中的每个\\n更改为\\r\\n ,它在 Mac 上运行良好。 但是,如果我这样做,它会在 Windows PC 上停止工作。

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

不同的平台有不同的“换行”代码。 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'模式:

蟒蛇2:

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

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

蟒蛇3:

在 Python 3 中, 'U'模式是默认行为,如文档所述:

允许使用额外的模式字符'U' ,它不再有任何效果,被视为已弃用。 它之前在文本模式下启用了通用换行符,这成为 Python 3.0 中的默认行为。 有关更多详细信息,请参阅newline参数的文档。

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

在 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

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

换行符控制通用换行符模式的工作方式(它仅适用于文本模式)。 它可以是 None、''、'\\n'、'\\r' 和 '\\r\\n'。 它的工作原理如下:

从流中读取输入时,如果换行符为 None,则启用通用换行符模式。 输入中的行可以以 '\\n'、'\\r' 或 '\\r\\n' 结尾,这些在返回给调用者之前会被转换为 '\\n'。 如果是 '',则启用通用换行符模式,但行尾会返回给调用者未翻译。 如果它具有任何其他合法值,则输入行仅由给定的字符串终止,并且行尾未翻译地返回给调用者。

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

使用U模式说明符的旧方式已被弃用,以支持这种新方式。

'U' 通用换行符模式(已弃用)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM