Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
'\n';==';posix&x27'\r\n';==';新界';(python)对吗?_Python_Posix_Carriage Return_Linefeed_Nt - Fatal编程技术网

'\n';==';posix&x27'\r\n';==';新界';(python)对吗?

'\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

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

解决方案概述:

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上,他们只是按原样写入字符串,这