2016-04-27 87 views
4

我工作在Ubuntu的python3.4脚本,我参数的文件(编码为UTF-8),在Windows下生成。我必须逐行浏览文件(用\r\n分隔),因为知道“行”包含我想保留的一些'\n'禁用从 r n自动更改为 n在python

我的问题是Python在打开时将文件的"\r\n"转换为"\n"。我试图用不同的模式打开("r","rt""rU")。

我发现的唯一解决方案是以二进制模式工作,而不是文本模式,打开"rb"模式。

有没有办法做到这一点,而无需使用二进制模式或正确的方式来做到这一点?

编辑:解决方法:

with open(filename, "r", newline='\r\n') as f: 

回答

6

设置newline关键字参数open()'\r\n',或者为空字符串:

with open(filename, 'r', encoding='utf-8', newline='\r\n') as f: 

这告诉Python来上唯一的分割线\r\n行结束符;输出中保持不变。如果将其设置为'',则\n也可视为行终止符,但\r\n未翻译为\n

open() function documentation

换行符控制universal newlines模式是如何工作的(它仅适用于文本模式)。它可以是None,'','\n','\r''\r\n'[...]如果是'',则启用通用换行符模式,但行结束符将返回给调用方未翻译。如果它具有任何其他合法值,则输入行仅由给定字符串终止,并且行尾以未翻译形式返回给调用者。

大胆强调我的。

+0

注意:模式和'encoding'参数在这里是可选的(''r''是任何地方的默认模式,除非你知道编码是'utf-8',否则它可能是正确的编码以使用;在Windows上,如果不是更常见的话,“utf-16”和特定于语言环境的代码页同样很常见)。 – ShadowRanger

+1

@ShadowRanger:当然,但显式仍然比隐式更好。我总是强烈建议不要将编码保留为默认值。 –

+0

解决方案是: '与开放(文件名,'r',encoding ='utf-8',newline ='\ r \ n')作为f:' 感谢您的线索 – lu1her