【问题标题】:How to split only on carriage returns with readlines in python?如何在 python 中使用 readlines 仅在回车上拆分?
【发布时间】:2014-06-27 16:58:38
【问题描述】:

我有一个包含\n\r\n 行尾标记的文本文件。我只想在\r\n 上拆分,但无法找到使用 python 的 readlines 方法执行此操作的方法。有没有简单的解决方法?

【问题讨论】:

    标签: python newline carriage-return


    【解决方案1】:

    正如@eskaev 所提到的,如果没有必要,您通常希望避免将整个文件读入内存。

    io.open() 允许您指定 newline 关键字参数,因此您仍然可以迭代行并让它们在指定的换行符处拆分

    import io
    
    for line in io.open('in.txt', newline='\r\n'):
        print repr(line)
    

    输出:

    u'this\nis\nsome\r\n'
    u'text\nwith\nnewlines.'
    

    【讨论】:

    • 值得注意的是io.open是Python 3内置的open函数。您只需要在 Python 2 的 io 模块中查找即可。
    【解决方案2】:

    避免在文本模式下阅读。 Python 使用universal newline support 读取文本文件。这意味着 all 行结尾被解释为\n:

    >>> with open('out', 'wb') as f:
    ...     f.write(b'a\nb\r\nc\r\nd\ne\r\nf')
    ... 
    14
    >>> with open('out', 'r') as f: f.readlines()
    ... 
    ['a\n', 'b\n', 'c\n', 'd\n', 'e\n', 'f']
    

    请注意,使用U 不会改变结果1

    >>> with open('out', 'rU') as f: f.readlines()
    ... 
    ['a\n', 'b\n', 'c\n', 'd\n', 'e\n', 'f']
    

    但是,您始终可以以二进制模式读取文件,对其进行解码,然后在 \r\n 上拆分:

    >>> with open('out', 'rb') as f: f.read().split(b'\r\n')
    ... 
    [b'a\nb', b'c', b'd\ne', b'f']
    

    (python3中的示例。您可以在split之前或之后将decode字节转换为unicode)。

    您可以避免将整个文件读入内存,而是分块读取。但是,正确处理这些行变得有点复杂(您必须手动检查最后一行的开始位置并将其连接到下一个块)。


    1 我相信这是因为在所有正常安装中默认启用通用换行符。您必须在配置安装时显式禁用它,然后 rrU 模式会有不同的行为(第一个只会在操作系统本机行结尾处拆分行,后者会产生结果如上所示)。

    【讨论】:

      【解决方案3】:

      这种方法将文件作为生成器读取为由分隔符分割的块。

      ifs = open(myFile)
      for chunk in ifs.read().split(mySep):
          #do something with the chunk
      

      【讨论】:

        【解决方案4】:

        不使用 readline,只使用 read 和 split。

        举例

        with open('/path/to/file', 'r') as f:
            fileContents = f.read() #read entire file
            filePieces = fileContents.split('\r\n')
        

        【讨论】:

          猜你喜欢
          • 2010-12-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-03-09
          • 1970-01-01
          • 2020-11-03
          • 2012-10-11
          • 2018-09-09
          相关资源
          最近更新 更多