[英]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'
模式:我想这可能取决于您正在阅读的内容,但是内置的 open() 函数采用“模式”参数,如果您为模式传递“U”,Python 2 将处理换行符透明的跨平台方式。 它要求使用通用换行支持构建 Python,但请测试一下!
https://docs.python.org/2/library/functions.html#open
在 Python 3 中, 'U'
模式是默认行为,如文档所述:
允许使用额外的模式字符
'U'
,它不再有任何效果,被视为已弃用。 它之前在文本模式下启用了通用换行符,这成为 Python 3.0 中的默认行为。 有关更多详细信息,请参阅newline参数的文档。
在 Python 3 中,在 open() 中使用关键字参数 "newline='\\n'" 以在写入文本文件时使用指定的行分隔符。 有关更多信息,请参阅:
https://pythonconquerstheuniverse.wordpress.com/2011/05/08/newline-conversion-in-python-3/
在 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.