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
Python文件对象可以为您处理.默认情况下,写入文本模式文件会将\n行结尾转换为platform-local,但您可以覆盖此行为.
换行符控制通用换行模式的工作方式(仅适用于文本模式).它可以是
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常量.