1

我正在编写一个 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)    
    

我必须考虑其他人吗?os.name 有其他选择('posix'、'nt'、'os2'、'ce'、'java'、'riscos')。我应该改用平台模块吗?

更新1:

  1. 目标是在任何操作系统中使用 '\r\n'。

  2. 我正在接收来自的 str

    str = etree.tostring(root, pretty_print=True, xml_declaration=True, encoding='UTF-8')

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

4

1 回答 1

7

Python 文件对象可以为您处理这个问题。默认情况下,写入文本模式文件会将\n行尾转换为平台本地,但您可以覆盖此行为。

请参阅功能文档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:

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

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

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

import io

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

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

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

于 2016-12-05T11:01:24.380 回答