'\n'=='posix','\ r \n'=='nt'(python)是正确的吗?

fab*_*ber 1 python nt posix carriage-return linefeed

我正在写一个写入文件的python(2.7)脚本,必须在linux,windows和osx上运行.不幸的是,对于兼容性问题,我必须在windows风格中使用回车和换行.如果我假设这样可以:

str = someFunc.returnA_longText()
with open('file','w') as f:
    if os.name == 'posix':
        f.write(str.replace('\n','\r\n'))
    elif os.name == 'nt'
        f.write(str)    
Run Code Online (Sandbox Code Playgroud)

我还要考虑别的吗?os.name还有其他选择('posix','nt','os2','ce','java','riscos').我应该使用平台模块吗?

更新1:
1.目标是在任何操作系统中使用'\ r \n'.
我正在收到str

str = etree.tostring(root, pretty_print=True, 
                     xml_declaration=True, encoding='UTF-8')
Run Code Online (Sandbox Code Playgroud)

我不是在读文件.
我的错,我应该检查os.linesep而不是?

解决方案回顾:

with io.open('file', mode='w', newline='\r\n', encoding='utf8') as f:
    f.write(etree.tostring(root, pretty_print=True,
                           xml_declaration=True, encoding='UTF-8').decode('utf-8'))
Run Code Online (Sandbox Code Playgroud)

感谢@Martijn Pieters

Mar*_*ers 7

Python文件对象可以为您处理.默认情况下,写入文本模式文件会将\n行结尾转换为platform-local,但您可以覆盖此行为.

请参阅功能文档中newline选项:open()

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

  • 从流中读取输入时,如果是换行符None,则启用通用换行模式.输入中的行可以以'\n',, '\r'或者结束'\r\n',并且'\n'在返回给调用者之前将这些行转换为.如果是'',则启用通用换行模式,但行结尾将返回到未翻译的调用者.如果它具有任何其他合法值,则输入行仅由给定字符串终止,并且行结尾将返回给未调用的调用者.
  • 将输出写入流时,如果是换行符,则写入的None任何'\n'字符都将转换为系统默认行分隔符os.linesep.如果换行是'''\n',则不进行翻译.如果换行符是任何其他合法值,则'\n'写入的任何字符都将转换为给定的字符串.

(以上适用于Python 3,Python 2具有类似的行为,io.open()如果需要,可以提供Python 3 I/O选项).

newline如果您需要强制写入哪些行结尾,请设置该选项:

with open('file', 'w', newline='\r\n') as f:
Run Code Online (Sandbox Code Playgroud)

在Python 2中,您必须以二进制模式打开文件:

with open('file', 'wb') as f:
    # write `\r\n` line separators, no translation takes place
Run Code Online (Sandbox Code Playgroud)

或使用io.open()和编写Unicode文本:

import io

with io.open('file', 'w', newline='\r\n', encoding='utf8') as f:
     f.write(str.decode('utf8'))
Run Code Online (Sandbox Code Playgroud)

(但是选择适当的编码;即使在Python 3中也明确指定编解码器总是一个好主意).

如果程序需要知道当前平台的相应行分隔符,则可以始终使用os.linesep常量.