'\n';==';posix&x27'\r\n';==';新界';(python)对吗?
我正在编写一个python(2.7)脚本,它编写一个文件,并且必须在linux、windows甚至osx上运行。 不幸的是,由于兼容性问题,我不得不在windows风格中使用回车符和换行符。 如果我假设:'\n';==';posix&x27'\r\n';==';新界';(python)对吗?,python,posix,carriage-return,linefeed,nt,Python,Posix,Carriage Return,Linefeed,Nt,我正在编写一个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
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 解决方案概述:
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'))
多亏了@Martijn Pieters,Python文件对象可以为您处理这个问题。默认情况下,写入文本模式文件会将
\n
行结尾转换为平台本地,但您可以覆盖此行为
请参阅中的换行符选项:
换行符控制通用换行符模式的工作方式(它仅适用于文本模式)。它可以是None
,'
,'\n'
,'\r'
和'\r\n'
。其工作原理如下:
- 从流读取输入时,如果换行符为
None
,则启用通用换行符模式。输入中的行可以以'\n'
、'\r'
或'\r\n'
结尾,这些行在返回给调用方之前被翻译成'\n'
。如果是”
,则启用通用换行符模式,但行尾将返回给调用方,而不进行翻译。如果它具有任何其他合法值,则输入行仅由给定的字符串终止,并且行尾未经翻译返回给调用方
- 将输出写入流时,如果换行符为
None
,则写入的所有'\n'
字符将转换为系统默认的行分隔符os.linesep
。如果换行符是'
或'\n'
,则不会进行转换。如果换行符是任何其他合法值,则写入的任何'\n'
字符都将转换为给定字符串
(以上内容适用于Python3,Python2有,如果需要,可以提供Python3 I/O选项)
如果需要强制写入哪些行尾,请设置换行符
选项:
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'))
(但是选择适当的编码;即使在Python3中明确指定编解码器也是一个好主意)
如果程序需要知道当前平台的适当行分隔符,则始终可以使用。Python文件对象可以为您处理此问题。默认情况下,写入文本模式文件会将\n
行结尾转换为平台本地,但您可以覆盖此行为
请参阅中的换行符选项:
换行符控制通用换行符模式的工作方式(它仅适用于文本模式)。它可以是None
,'
,'\n'
,'\r'
和'\r\n'
。其工作原理如下:
- 从流读取输入时,如果换行符为
None
,则启用通用换行符模式。输入中的行可以以'\n'
、'\r'
或'\r\n'
结尾,这些行在返回给调用方之前被翻译成'\n'
。如果是”
,则启用通用换行符模式,但行尾将返回给调用方,而不进行翻译。如果它具有任何其他合法值,则输入行仅由给定的字符串终止,并且行尾未经翻译返回给调用方
- 将输出写入流时,如果换行符为
None
,则写入的所有'\n'
字符将转换为系统默认的行分隔符os.linesep
。如果换行符是'
或'\n'
,则不会进行转换。如果换行符是任何其他合法值,则写入的任何'\n'
字符都将转换为给定字符串
(以上内容适用于Python3,Python2有,如果需要,可以提供Python3 I/O选项)
如果需要强制写入哪些行尾,请设置换行符
选项:
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'))
(但是选择适当的编码;即使在Python3中明确指定编解码器也是一个好主意)
如果您的程序需要知道当前平台的适当行分隔符,则始终可以使用。OP的可能重复不希望使用平台本地行结尾。他们希望在所有平台上都使用DOS行尾,所以我认为第一句话没有抓住要点。@SvenMarnach:他们的代码表明情况并非如此。他们是根据os.name
进行切换的。我不这么认为。在Windows上,他们只按原样写入字符串,这会导致\r\n
行结束。在POSIX上,它们将\n
替换为\r\n
,这也会导致\r\n
行结束。问题文本也很清楚。@faber:那么您使用的是Python 2。使用导入io
和io.open()
(并编写Unicode文本)。另一种方法是以二进制模式打开文件,这样就不会进行行转换。@费伯:请参阅对我答案的更新,使用io.open()
时需要编写unicode。OP不希望使用平台本地行结尾。他们希望在所有平台上都使用DOS行尾,所以我认为第一句话没有抓住要点。@SvenMarnach:他们的代码表明情况并非如此。他们是根据os.name
进行切换的。我不这么认为。在Windows上,他们只是按原样写入字符串,这