【问题标题】:disable the automatic change from \r\n to \n in python在 python 中禁用从 \r\n 到 \n 的自动更改
【发布时间】:2016-04-27 13:49:15
【问题描述】:

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

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

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

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

编辑:解决方案:

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

【问题讨论】:

    标签: python windows python-3.x unix line-endings


    【解决方案1】:

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

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

    这告诉 Python 只在 \r\n 行终止符上分割行; \n 在输出中保持不变。如果将其设置为 ''\n 也被视为行终止符,但 \r\n 不会转换为 \n

    来自open() function documentation

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

    我的大胆强调。

    【讨论】:

    • 注意:模式和encoding 参数在这里都是可选的('r' 是所有地方的默认模式,除非你知道编码是utf-8,否则它可能是也可能不是使用正确的编码;在 Windows 上 utf-16 和特定于语言环境的代码页同样常见(如果不是更常见的话)。
    • @ShadowRanger:当然,但显式仍然比隐式好。我始终强烈建议不要将 encoding 保留为默认值。
    • 解决方案是:with open(filename, 'r', encoding='utf-8', newline='\r\n') as f: 感谢提供线索
    • @MartijnPieters:我基本同意,但是很难保证输入编码实际上是什么。我同意encoding 应始终指定(作为 UTF 格式,8 或 16)打开写入时,打开文件时使用显式编码创建您自己的脚本,或处理互联网派生数据(其中 utf-8是标准),但是当您的输入数据不是由您生成并且可能采用操作系统语言环境编码(例如,大多数西欧/英语语言环境中的cp1252)时,很难证明其合理性。无论哪种方式,这都是一个难题。
    • @ShadowRanger:最好事先明确确定编码可能是什么。例如,询问提供文件的用户。例如,Windows 默认很少适合您的文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-28
    • 2015-03-29
    • 2023-01-25
    • 2021-11-04
    • 1970-01-01
    • 2020-06-25
    • 1970-01-01
    相关资源
    最近更新 更多