如何在Python中使用readlines()函数仅按换行符分割文本?

7

我有一个文本文件,其中包含\n\r\n两种行尾标记。我想只在\r\n处进行拆分,但是使用Python的readlines方法无法实现。是否有简单的解决方法?

4个回答

10

正如 @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.'

5
值得注意的是,io.open 是 Python 3 中内置的 open 函数。在 Python 2 中,你只需要在 io 模块中查找它即可。 - Blckknght

3
避免以文本模式阅读。Python使用通用换行符支持读取文本文件。这意味着所有的行结束都被解释为\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之前或之后将字节解码为Unicode。)

您可以避免将整个文件读入内存,而是分块读取它。但是,正确处理行变得有点复杂(您必须手动检查上一行从哪里开始,并将其与下一个块连接起来)。


我认为这是因为在所有正常安装中,默认启用了通用换行符。您需要在配置安装时明确禁用它,然后rrU模式将具有不同的行为(前者仅在操作系统本地换行符上拆分行,而后者将产生上面显示的结果)。

1
这种方法将文件作为生成器读取,以分隔符分割成块。
ifs = open(myFile)
for chunk in ifs.read().split(mySep):
    #do something with the chunk

0

不要使用readline,直接使用read和split。

例如:

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

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