禁用Python中\r\n自动转换为\n的功能

5

我正在ubuntu上使用Python3.4脚本工作,其中我接收一个在Windows下生成并编码为UTF-8的文件作为参数。我必须逐行(由\r\n分隔)浏览该文件,知道这些“行”包含一些我想保留的'\n'

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

我找到的唯一解决方案是以二进制模式而不是文本模式工作,使用"rb"模式打开文件。

有没有一种不使用二进制模式或正确的方法来解决这个问题?

2个回答

7

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

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

这告诉Python仅在\r\n行终止符上拆分行;输出中保留\n。如果您将其设置为'',则\n也被视为行终止符,但\r\n不会转换为\n
来自open()函数文档

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

加粗强调是我的。

注意:这里的模式和“编码”参数都是可选的('r'是默认模式,除非您知道编码是utf-8,否则可能不是正确的编码;在Windows上,utf-16和特定于区域设置的代码页同样常见,甚至更常见)。 - ShadowRanger
1
@ShadowRanger:当然,但显式总比隐式更好。我始终强烈建议不要将“编码”留给默认值。 - Martijn Pieters
解决方案是: with open(filename, 'r', encoding='utf-8', newline='\r\n') as f: 感谢提示。 - lu1her
@MartijnPieters:我基本上同意,但是确切保证输入编码是什么实际上很难。我同意在写入时应该始终指定encoding(作为UTF格式,8或16),并且在打开使用显式编码的自己脚本创建的文件或处理来自互联网的数据(其中utf-8是标准)时也应该指定。但是当您的输入数据不是由您生成的,并且可能处于操作系统区域设置编码(例如,在大多数西欧/英语区域设置中为cp1252)时,很难进行较好的解释。无论哪种方式都是一个难题。 - ShadowRanger
@ShadowRanger:最好事先明确编码可能是什么。例如,询问提供文件的用户。例如,Windows 默认编码很少正确适用于您的文件。 - Martijn Pieters
@MartijnPieters:我只希望我们能够达成一致,始终为UTF编码的文本包含BOM,即使是UTF-8数据(其中字节顺序不是问题)。这将使非启发式地识别常见编码变得更加容易;检查BOM,如果有,则使用该编码,如果没有,则使用系统默认值。那将会很好。 :-) - ShadowRanger

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接