【问题标题】:Python, read CRLF text file as is, with CRLFPython,使用 CRLF 按原样读取 CRLF 文本文件
【发布时间】:2013-12-03 11:47:00
【问题描述】:
with open(fn, 'rt') as f:
    lines = f.readlines()

这会读取 CR LF 文本文件 (WinXP, Py 2.6) 以 LF 行结束。所以lines 包含 '\n' 结尾。如何按原样获取线条:

  • 对于 CRLF 文件,获取以 '\n\r' 结尾的行
  • 对于 LF 文件,获取以 '\n' 结尾的行

【问题讨论】:

    标签: python python-2.7 file-io line-endings


    【解决方案1】:

    使用io.open() 代替内置的open() 函数。这使您可以更好地控制使用 newline 参数处理换行符的方式:

    import io
    
    with io.open(fn, 'rt', newline='') as f:
        lines = f.readlines()
    

    newline 设置为空字符串,启用通用换行支持,但返回未翻译的行尾;您仍然可以使用.readlines() 查找以任何合法行终止符终止的行,但返回的数据与文件中的数据完全相同:

    输入时,如果换行符是None,则启用通用换行符模式。输入中的行可以以'\n''\r''\r\n' 结尾,这些行在返回给调用者之前会被翻译成'\n'。如果是'',则启用通用换行模式,但行尾未翻译返回给调用者

    强调我的。

    这与以二进制模式打开文件不同,其中.readlines() 只会在\n 字符上拆分文件。对于带有\r 行结尾或混合行结尾的文件,这意味着行将不会被正确拆分。

    演示:

    >>> import io
    >>> open('test.txt', 'wb').write('One\nTwo\rThree\r\n')
    >>> open('test.txt', 'rb').readlines()
    ['One\n', 'Two\rThree\r\n']
    >>> io.open('test.txt', 'r', newline='').readlines()
    [u'One\n', u'Two\r', u'Three\r\n']
    

    请注意,io.open() 还将文件内容解码为 un​​icode 值。

    【讨论】:

    • 这太棒了!但是查看 3.5 文档,我发现内置的“open()”对newline 参数具有相同的支持。也许这在过去的某个时候改变了?
    • 我现在才看到 OP 要求提供 2.x 解决方案。
    • @cxxl:这个问题是 Python 2.x 特有的,是的,内置的 open 不是同一个函数。在 Python 3.x 中,io.openopen 是完全相同的函数。
    猜你喜欢
    • 1970-01-01
    • 2016-10-22
    • 1970-01-01
    • 2019-08-06
    • 1970-01-01
    • 2020-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多